我正在寻找一种通用的解决方案,以从JSON字符串列中提取所有的JSON字段作为列。
我知道可以通过创建已定义模式的StructType并使用'from_json'方法来提取列。但是这种方法需要手动定义模式。
df = spark.read.load(path)
df.show()
'path'路径下的文件格式为parquet。
样例数据
|id | json_data
| 1 | {"name":"abc", "depts":["dep01", "dep02"]}
| 2 | {"name":"xyz", "depts":["dep03"],"sal":100}
| 3 | {"name":"pqr", "depts":["dep02"], "address":{"city":"SF","state":"CA"}}
期望输出结果
|id | name | depts | sal | address_city | address_state
| 1 | "abc" | ["dep01", "dep02"] | null| null | null
| 2 | "xyz" | ["dep03"] | 100 | null | null
| 3 | "pqr" | ["dep02"] | null| "SF" | "CA"
我知道可以通过创建已定义模式的StructType并使用'from_json'方法来提取列。但是这种方法需要手动定义模式。
val myStruct = StructType(
Seq(
StructField("name", StringType),
StructField("depts", ArrayType(StringType)),
StructField("sal", IntegerType)
))
var newDf = df.withColumn("depts", from_json(col("depts"), myStruct))
有没有更好的方法在不手动定义架构的情况下展开JSON列? 在所提供的示例中,我可以看到可用的JSON字段。 但实际上,我无法遍历所有行以查找所有字段。
因此,我正在寻找一种解决方案,可以将所有字段拆分为列,而无需指定列的名称或类型。