如何在pyspark中将JSON键值对转换为记录?
我有一系列类似这样的JSON:如何在pyspark中将JSON键值对转换为记录?,pyspark,Pyspark,我有一系列类似这样的JSON: { id: '121', values: { "Value A": 1, "Value B": 2, "Value C": 3 } } id | key | value ____ _________ ______ 121 | Value A | 1 121 | Value B | 2 121 | Value C | 3
{
id: '121',
values: {
"Value A": 1,
"Value B": 2,
"Value C": 3
}
}
id | key | value
____ _________ ______
121 | Value A | 1
121 | Value B | 2
121 | Value C | 3
键值对的数量可能会有所不同
我想创建一个pyspark程序,它将接受此数据并将其分解为一个类似以下内容的数据帧:
{
id: '121',
values: {
"Value A": 1,
"Value B": 2,
"Value C": 3
}
}
id | key | value
____ _________ ______
121 | Value A | 1
121 | Value B | 2
121 | Value C | 3
我可以使用以下方法获取id和value列:
df = sess.read.json('Projects/spark/data/*')
df.select('id',explode(array(expr('values.*'))).name('vals')).dropna().show()
但是我还没有找到一种方法来提取密钥。有人知道怎么做吗?我阅读了json,它将
MapType
作为值的数据类型。然后我简单地使用map\u keys
提取键,使用map\u values
提取值,然后分解数组
from pyspark.sql.functions import arrays_zip, col, explode, map_keys, map_values
json1={
'id': '121',
'values': {
"Value A": 1,
"Value B": 2,
"Value C": 3
}
}
df2=spark.createDataFrame([(json1)])
df2.select(col('id'),col('values'), map_keys("values").alias("keys"),
map_values("values").alias('inner_values'),
).withColumn("tmp",arrays_zip("keys","inner_values"))\
.withColumn("tmp",explode("tmp")).select(col("id"),\
col("tmp.keys"),col("tmp.inner_values")).show()
+---+-------+------------+
| id| keys|inner_values|
+---+-------+------------+
|121|Value C| 3|
|121|Value A| 1|
|121|Value B| 2|
+---+-------+------------+
我阅读了json,它将MapType
作为值的数据类型。然后我简单地使用map\u keys
提取键,使用map\u values
提取值,然后分解数组
from pyspark.sql.functions import arrays_zip, col, explode, map_keys, map_values
json1={
'id': '121',
'values': {
"Value A": 1,
"Value B": 2,
"Value C": 3
}
}
df2=spark.createDataFrame([(json1)])
df2.select(col('id'),col('values'), map_keys("values").alias("keys"),
map_values("values").alias('inner_values'),
).withColumn("tmp",arrays_zip("keys","inner_values"))\
.withColumn("tmp",explode("tmp")).select(col("id"),\
col("tmp.keys"),col("tmp.inner_values")).show()
+---+-------+------------+
| id| keys|inner_values|
+---+-------+------------+
|121|Value C| 3|
|121|Value A| 1|
|121|Value B| 2|
+---+-------+------------+
更简单的解决方案是同时使用分解()
和选择()
在这里创建DF
输出
这里的逻辑:选择()和分解()一起
更简单的解决方案是同时使用分解()
和选择()
在这里创建DF
输出
这里的逻辑:选择()和分解()一起
如果这个解决方案对你有帮助,你能帮我接受吗如果这个解决方案对你有帮助,你能帮我接受吗。。