gpt4 book ai didi

json - Spark 将 StructType/JSON 转换为字符串

转载 作者:行者123 更新时间:2023-12-04 12:18:45 31 4
gpt4 key购买 nike

我有一个换行符分隔的 json 文件,看起来像

{"id":1,"nested_col": {"key1": "val1", "key2": "val2", "key3": ["arr1", "arr2"]}}
{"id":2,"nested_col": {"key1": "val1_2", "key2": "val2_2", "key3": ["arr1_2", "arr2"]}}

一旦我使用 df = spark.read.json(path_to_file) 读取文件,我最终得到一个数据框,其架构如下所示:
DataFrame[id: bigint,nested_col:struct<key1:string,key2:string,key3:array<string>>]

我想做的是投 nested_col查看它是一个没有设置的字符串 primitivesAsString为 true(因为我实际上有 100 多个列并且需要推断所有其他列的类型)。我也不知道是什么 nested_col看起来像以前。换句话说,我想要我的 DataFrame看起来像
DataFrame[id: bigint,nested_col:string]

我试着做
df.select(df['nested_col'].cast('string')).take(1)`

但它不会返回 JSON 的正确字符串表示形式:

[Row(nested_col=u'[0,2000000004,2800000004,3000000014,316c6176,326c6176,c00000002,3172726100000010,32727261]')]`

而我希望:

[Row(nested_col=u'{"key1": "val1", "key2": "val2", "key3": ["arr1", "arr2"]}')]

有谁知道我如何获得所需的结果(也就是将嵌套的 JSON 字段/ StructType 转换为字符串)?

最佳答案

老实说,解析 JSON 并推断模式只是为了将所有内容推回 JSON 听起来有点奇怪,但您在这里:

  • 所需的进口:

    from pyspark.sql import types
    from pyspark.sql.functions import to_json, concat_ws, concat, struct
  • 一个辅助函数:

    def jsonify(df):
    def convert(f):
    if isinstance(f.dataType, types.StructType):
    return to_json(f.name).alias(f.name)
    if isinstance(f.dataType, types.ArrayType):
    return get_json_object(
    to_json(struct(f.name)),
    "$.{0}".format(f.name)
    ).alias(f.name)
    return f.name

    return df.select([convert(f) for f in df.schema.fields])
  • 用法示例:

    df = sc.parallelize([("a", 1, (2, 3), ["1", "2", "3"])]).toDF()

    jsonify(df).show()

    +---+---+---------------+-------------+
    | _1| _2| _3| _4|
    +---+---+---------------+-------------+
    | a| 1|{"_1":2,"_2":3}|["1","2","3"]|
    +---+---+---------------+-------------+
  • 关于json - Spark 将 StructType/JSON 转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41730369/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com