首页 > 解决方案 > 如何将 JSON 键值对转换为 pyspark 中的记录?

问题描述

我有一系列看起来像这样的 JSON:

{
    id: '121',
    values: {
        "Value A": 1, 
        "Value B": 2, 
        "Value C": 3
    }
}

键值对的数量可以变化。

我想创建一个 pyspark 程序,将其分解为如下所示的 DataFrame:

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()

但是我还没有找到提取密钥的方法。有谁知道如何做到这一点?

标签: pyspark

解决方案


我阅读了MapType作为 dtype的 json values。然后我简单地使用提取键map_keys和使用值map_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|
+---+-------+------------+

推荐阅读