pyspark - 如何将 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()
但是我还没有找到提取密钥的方法。有谁知道如何做到这一点?
解决方案
我阅读了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|
+---+-------+------------+
推荐阅读
- flutter - 如何修复flatbutton中倒置的“ok”文本?
- git - 如何找到 npm 版本的 git 哈希?
- wix - WiX 安装在与标准 ProgramFilesFolder 名称不同的驱动器上
- c# - 服务器端 Blazor 中单个 EditForm 中的多个模型验证
- sql - 根据字符串列从多条记录中获取记录
- vb.net - 双击datagrid并粘贴到数据库记录
- ios - 后台进程无法从 Navigator 弹出() showDialog
- powerbi - 为什么我不能对这个 PowerBI 图表进行排序?
- graphql - GraphQL 查询中的变量
- java - java中的菜单不会调用函数switch()