python - 将表列和值转换为嵌套 JSON
问题描述
我有一个 CSV 文件,其列如下
嵌套 JSON 对象所需的结果如下:
{
"Type" : "A"
"Value" :"1"
}
{
"Type" : "B"
"Value" :"1"
}
我尝试了以下代码:任何帮助将不胜感激。
from pyspark.sql.functions import *
list1=['A','B','C']
df2=spark.sql("select * from test limit 10" )
df3=df2.select(list1)
for i in range(0,len(list1)):
df4=df3.withColumn("Type",lit(list1[i]))
解决方案
这可以通过 UnPivoting 的技巧来完成...
假设您有如下数据集.. 我们称它为患者的测试结果.. A、B、C 列表示.. 测试类型 A 、测试类型 B ......并且这些列中的值表示数字测试结果
+-------------+---+---+---+---+---+---+---+
|PatientNumber| A| B| C| D| E| F| G|
+-------------+---+---+---+---+---+---+---+
| 101| 1| 2| 3| 4| 5| 6| 7|
| 102| 11| 12| 13| 14| 15| 16| 17|
+-------------+---+---+---+---+---+---+---+
我添加了一个 PatientNumber 列,只是为了让数据看起来更合理。您可以从代码中删除它。
我将此数据集添加到 csv..
val testDF = spark.read.format("csv").option("header", "true").load("""C:\TestData\CSVtoJSon.csv""")
让我们创建 2 个数组,一个用于 id 列,另一个用于所有测试类型。
val idCols = Array("PatientNumber")
val valCols = testDF.columns.diff(idCols)
然后这是 Unpivot 的代码
val valcolNames = valCols.map(x => List(''' + x + ''', x))
val unPivotedDF = testDF.select($"PatientNumber", expr(s"""stack(${valCols.size},${valcolNames.flatMap(x => x).mkString(",")} ) as (Type,Value)"""))
这是 Unpivoted 数据的样子 -
+-------------+----+-----+
|PatientNumber|Type|Value|
+-------------+----+-----+
| 101| A| 1|
| 101| B| 2|
| 101| C| 3|
| 101| D| 4|
| 101| E| 5|
| 101| F| 6|
| 101| G| 7|
| 102| A| 11|
| 102| B| 12|
| 102| C| 13|
| 102| D| 14|
| 102| E| 15|
| 102| F| 16|
| 102| G| 17|
+-------------+----+-----+
最后将这个 Unpivoted DF 写为 Json -
unPivotedDF.coalesce(1).write.format("json").mode("Overwrite").save("""C:\TestData\output""")
Json 文件的内容看起来与您想要的结果相同 -
{"PatientNumber":"101","Type":"A","Value":"1"}
{"PatientNumber":"101","Type":"B","Value":"2"}
{"PatientNumber":"101","Type":"C","Value":"3"}
{"PatientNumber":"101","Type":"D","Value":"4"}
{"PatientNumber":"101","Type":"E","Value":"5"}
{"PatientNumber":"101","Type":"F","Value":"6"}
{"PatientNumber":"101","Type":"G","Value":"7"}
{"PatientNumber":"102","Type":"A","Value":"11"}
{"PatientNumber":"102","Type":"B","Value":"12"}
{"PatientNumber":"102","Type":"C","Value":"13"}
{"PatientNumber":"102","Type":"D","Value":"14"}
{"PatientNumber":"102","Type":"E","Value":"15"}
{"PatientNumber":"102","Type":"F","Value":"16"}
{"PatientNumber":"102","Type":"G","Value":"17"}
推荐阅读
- docker - 尝试在 docker 容器中运行弹性服务时禁用 [groovy] 的动态脚本
- java - 只注册一个receiver的前台服务是26MB,我如何让它变小或找出大小来自哪里?
- vim - 如何定义单个文件的设置并使用 git 将它们与文件同步?
- json - 验证 JSON 字段排序顺序
- matlab - 训练网络时如何解决“Incorrectly defined MiniBatchable Datastore”错误
- forms - 使用 VueJS + Laravel 发送表单会导致 419 错误
- python - python中的grep多个字符串功能
- javascript - Angular 4在console.log中获取数据但不在html中呈现
- keras - Keras 二进制分类
- ios - 'NSInternalInconsistencyException' 原因:'Could not load NIB in bundle' 出列 tableview 单元格时