Spark Dataframe 将 json 键值组合成一行 - Scala 或 Python
Spark Dataframe combine json key value in one row - Scala or Python
我正在查询如下所示的 spark sql 并尝试将列合并为一行:
interalexternalid = spark.sql("""Select InternalId, ExternalId from datatable limit 4""")
jsonDf = interalexternalid.select(to_json(struct([interalexternalid[x] for x in interalexternalid.columns])).alias("body"))
display(jsonDf)
我得到的数据是这样的:
"body"
{"InternalId":480941,"ExternalId":"a020H00001Tt7NrQAJ"}
{"InternalId":480942,"ExternalId":"a020H00001Tt7NsQAJ"}
{"InternalId":480556,"ExternalId":"a020H00001TdAEVQA3"}
{"InternalId":480557,"ExternalId":"a020H00001TdAEWQA3"}
我的 objective 是在 "body" 列
中获取如下数据
"body":
[{"InternalId": 480941}, {"ExternalId": "a020H00001Tt7NrQAJ"}]
[{"InternalId": 480942}, {"ExternalId": "a020H00001Tt7NsQAJ"}]
[{"InternalId": 480556}, {"ExternalId": "a020H00001TdAEVQA3"}]
[{"InternalId": 480557}, {"ExternalId": "a020H00001TdAEWQA3"}]
如何实现。我在上面的上下文中使用 python。但 python 和 scala 解决方案都会有所帮助。
谢谢
而不是 struct
使用 array
方法,因为您需要 body
作为数组。并使用 create_map
创建从列名到值的映射:
from pyspark.sql.functions import array, lit, col, to_json, create_map
df.select(to_json(
array(*[create_map(lit(c), col(c)) for c in df.columns])
).alias("body")).show(truncate=False)
+-------------------------------------------------------------+
|body |
+-------------------------------------------------------------+
|[{"InternalId":"480941"},{"ExternalId":"a020H00001Tt7NrQAJ"}]|
|[{"InternalId":"480942"},{"ExternalId":"a020H00001Tt7NsQAJ"}]|
|[{"InternalId":"480556"},{"ExternalId":"a020H00001TdAEVQA3"}]|
|[{"InternalId":"480557"},{"ExternalId":"a020H00001TdAEWQA3"}]|
+-------------------------------------------------------------+
我正在查询如下所示的 spark sql 并尝试将列合并为一行:
interalexternalid = spark.sql("""Select InternalId, ExternalId from datatable limit 4""")
jsonDf = interalexternalid.select(to_json(struct([interalexternalid[x] for x in interalexternalid.columns])).alias("body"))
display(jsonDf)
我得到的数据是这样的:
"body"
{"InternalId":480941,"ExternalId":"a020H00001Tt7NrQAJ"}
{"InternalId":480942,"ExternalId":"a020H00001Tt7NsQAJ"}
{"InternalId":480556,"ExternalId":"a020H00001TdAEVQA3"}
{"InternalId":480557,"ExternalId":"a020H00001TdAEWQA3"}
我的 objective 是在 "body" 列
中获取如下数据"body":
[{"InternalId": 480941}, {"ExternalId": "a020H00001Tt7NrQAJ"}]
[{"InternalId": 480942}, {"ExternalId": "a020H00001Tt7NsQAJ"}]
[{"InternalId": 480556}, {"ExternalId": "a020H00001TdAEVQA3"}]
[{"InternalId": 480557}, {"ExternalId": "a020H00001TdAEWQA3"}]
如何实现。我在上面的上下文中使用 python。但 python 和 scala 解决方案都会有所帮助。 谢谢
而不是 struct
使用 array
方法,因为您需要 body
作为数组。并使用 create_map
创建从列名到值的映射:
from pyspark.sql.functions import array, lit, col, to_json, create_map
df.select(to_json(
array(*[create_map(lit(c), col(c)) for c in df.columns])
).alias("body")).show(truncate=False)
+-------------------------------------------------------------+
|body |
+-------------------------------------------------------------+
|[{"InternalId":"480941"},{"ExternalId":"a020H00001Tt7NrQAJ"}]|
|[{"InternalId":"480942"},{"ExternalId":"a020H00001Tt7NsQAJ"}]|
|[{"InternalId":"480556"},{"ExternalId":"a020H00001TdAEVQA3"}]|
|[{"InternalId":"480557"},{"ExternalId":"a020H00001TdAEWQA3"}]|
+-------------------------------------------------------------+