【问题标题】:Spark Convert Json Array to Struct ArraySpark 将 Json 数组转换为结构体数组
【发布时间】:2021-08-09 21:28:28
【问题描述】:

我正在寻找将JSON字符串数组转换为结构数组的方法。

样本数据:

{
  "col1": "col1Value",
  "col2":[
    "{\"SubCol1\":\"ABCD\",\"SubCol2\":\"EFGH\"}",
    "{\"SubCol1\":\"IJKL\",\"SubCol2\":\"MNOP\"}"
  ]
}

数据集架构:

StructType(StructField(col1,StringType,true), StructField(col2,ArrayType(StringType,true),true))

预期输出:

{
  "col1": "col1Value",
  "col2":[
    {"SubCol1":"ABCD","SubCol2":"EFGH"},
    {"SubCol1":"IJKL","SubCol2":"MNOP"}
  ]
}

预期架构:

StructType(StructField(col1,StringType,true), StructField(col2,ArrayType(StructType(StructField(SubCol1,StringType,true), StructField(SubCol2,StringType,true)),true),true))

我尝试了df.withColumn("col2", from_json($"col2", new_schema)),但这给了我错误:

org.apache.spark.sql.AnalysisException: 由于数据类型不匹配,无法解析 'jsontostructs(`col2`)':参数 1 需要字符串类型,但是,'`col2`' 是数组类型。

【问题讨论】:

    标签: json scala dataframe apache-spark apache-spark-sql


    【解决方案1】:

    您可以先将col2 转换为字符串类型:

    val df2 = df.withColumn("col2", 
        from_json(
            $"col2".cast("string"), 
            lit("array<struct<SubCol1:string, SubCol2:string>>")
            // or use new_schema as in your code
        )
    )
    

    【讨论】:

    • df.withColumn("col2", from_json($"col2".cast("string"), ArrayType(new StructType().add("SubCol1",StringType).add("SubCol2",StringType)))) 解决了这个问题。谢谢。
    • 在同一行,我们如何将 MapType(StringType, StringType) 转换为 MapType(StringType, StructType)。在这里,我想将 JSON 字符串 Map 的值转换为 struct。将列数据转换为 String 在这里不起作用。
    猜你喜欢
    • 2014-11-13
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多