【问题标题】:Spark Cast StructType / JSON to StringSpark 将 StructType / JSON 转换为字符串
【发布时间】:2017-06-03 11:28:10
【问题描述】:

我有一个换行分隔的 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 scala apache-spark dataframe apache-spark-sql


    【解决方案1】:

    老实说,解析 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"]|
      +---+---+---------------+-------------+
      

    【讨论】:

    • 啊,to_json 是在 2.1 中添加的,而我使用的是 spark 2.0.1。这对我来说非常有效!
    猜你喜欢
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 2020-01-15
    • 2018-09-25
    • 2018-06-28
    • 1970-01-01
    • 2012-10-06
    相关资源
    最近更新 更多