如何在pyspark中将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

我有一系列类似这样的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
键值对的数量可能会有所不同

我想创建一个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 输出 这里的逻辑:选择()和分解()一起
如果这个解决方案对你有帮助,你能帮我接受吗如果这个解决方案对你有帮助,你能帮我接受吗。。