python - Pyspark使用json对象读取json,其中包含json列表,在转换为数据帧时会更改一些格式
问题描述
我有以下 json 对象列表:
[
{
"AccountId": "xxxx",
"ResourceId": "yyyy",
"ProductName": "zzzz",
"Tags": [{"Name": "John Doe"}, {"Environment":"DEV"}]
},
{
"AccountId": "aaaa",
"ResourceId": "bbbb",
"ProductName": "cccc",
"Tags": [{"Name": "Jane Doe"}, {"Environment":"DEV"}]
},
{
"AccountId": "iiii",
"ResourceId": "jjjj",
"ProductName": "kkkk",
"Tags": [{"Environment":"QA"}]
}
]
我尝试使用这种方式将其变成数据框:
ss = SparkSession.builder.appName("PythonSpark2").getOrCreate()
sc = ss.sparkContext
jsonList = someFunctionToCreate()
jsonDf = ss.read.json(sc.parallelize(jsonList))
jsonDf.show(truncate=False)
最终结果会弄乱“标签”列。数组内的 json 对象列表将被拆分为具有 json 值的数组的数组。
|---------------------|------------------|---------------------|---------------------|
| AccountId | ResourceId | ProductName | Tags |
|---------------------|------------------|---------------------|---------------------|
| xxxx | yyyy | zzzz | [[JohnDoe,],[,DEV]] |
|---------------------|------------------|---------------------|---------------------|
| aaaa | bbbb | cccc | [[JaneDoe,],[,DEV]] |
|---------------------|------------------|---------------------|---------------------|
| iiii | jjjj | kkkk | [[,],[,QA]] |
|---------------------|------------------|---------------------|---------------------|
我有办法防止这种情况吗?还是我为 json 使用了错误的结构?
解决方案
有一个函数只是将列转换为 json, to_json
.
df = spark.read.option("header","true").option("inferSchema","true").json("test.json")
df.show(truncate=False)
df.withColumn('Tags', to_json('Tags')).show(truncate=False)
+---------+-----------+----------+-------------------------------------------+
|AccountId|ProductName|ResourceId|Tags |
+---------+-----------+----------+-------------------------------------------+
|xxxx |zzzz |yyyy |[{"Name":"John Doe"},{"Environment":"DEV"}]|
|aaaa |cccc |bbbb |[{"Name":"Jane Doe"},{"Environment":"DEV"}]|
|iiii |kkkk |jjjj |[{"Environment":"QA"}] |
+---------+-----------+----------+-------------------------------------------+
推荐阅读
- javascript - Chrome 插件无法在 Api 调用中使用自定义用户代理
- ssl - TLS 握手失败,但通信未关闭
- c++ - boost.geometry 多边形差异返回自相交结果(或错误地检测到它)
- ios - 带有偏移 UIImage 的 UIKit UIImageView
- javascript - 第二次点击Ajax刷新数据?
- html - Google Web Designer 中的 Facebook 可播放广告
- nlp - 寻找一种算法来识别字符串的复杂性/唯一性,或者更确切地说是两个相同字符串来自同一来源的机会
- kubernetes - 如何确保入口控制器 Pod 在每个包含后端服务 Pod 的节点上运行?
- visual-studio-code - 是否可以在终端窗口中放置代码运行器图标?
- python-3.x - 在python中的starmap中的进程之间共享矩阵