json - 有没有一种方法可以在 pyspark 中一个一个地访问数组(结构)中的多个 JSON 对象
问题描述
我对 pyspark 和 json 解析有点陌生,我被困在某些特定场景中。让我先解释一下我想要做什么,我有一个 json 文件,其中有数据元素,该数据元素是一个包含其他两个 json 对象的数组。给定的json文件如下
{
"id": "da20d14c.92ba6",
"type": "Data Transformation Node",
"name": "",
"topic": "",
"x": 380,
"y": 240,
"typeofoperation":"join",
"wires": [
["da20d14c.92ba6","da20d14c.93ba6"]
],
"output":true,
"data":[
{
"metadata_id":"3434",
"id":"1",
"first_name":"Brose",
"last_name":"Eayres",
"email":"beayres0@archive.org",
"gender":"Male",
"postal_code":null
},
{
"metadata_id":"3434",
"id":"2",
"first_name":"Brose",
"last_name":"Eayres",
"email":"beayres0@archive.org",
"gender":"Male",
"postal_code":null
}
]
}
现在我想要做的是逐个迭代该数据数组:意味着迭代到json的第一个对象将其存储到数据帧中,然后迭代到第二个对象并将其存储到另一个数据帧中,然后进行完全连接或任何加入他们的类型。(是否可能)
如果是,如何在 pyspark 中执行此操作。到目前为止,我所做的是
试图爆炸它,但数据是一次爆炸而不是一个
from pyspark.sql import SparkSession
from pyspark.sql.functions import explode, col
from pyspark.sql.functions import *
from pyspark.sql import Row
from pyspark.sql import SQLContext
from pyspark import SparkConf, SparkContext
spark = SparkSession \
.builder \
.appName("Python Spark SQL basic example") \
.getOrCreate()
sc = SparkContext.getOrCreate()
dataFrame = spark.read.option("multiline", "true").json("nodeWithTwoRddJoin.json")
dataNode = dataFrame.select(explode("data").alias("Data_of_node"))
dataNode.show()
但是上面的代码给了我一个集体数据集。比我用的
firstDataSet = dataNode.collect()[0]
secondDataSet = dataNode.collect()[1]
这些行给了我一行,我无法协调回数据框。任何建议和解决方案
解决方案
您需要在数据框的每一行上应用一个映射,将其中一列的内容拆分为两个新列。之后将其结果分成两个数据帧是微不足道的。为了实现这一点,我使用了一个简单的函数,它从数组中返回所需的索引:
def splitArray(array, pos):
return array[pos]
您可以像这样应用此功能:
import pyspark.sql.functions as f
mapped = dataFrame.select(
splitArray(f.col('data'), 0).alias('first'),
splitArray(f.col('data'), 1).alias('second'))
(我使用内置的“col”函数来选择数据列。不确定是否有更优雅的方法来实现这一点。)
结果:
+-----------------------------------------------------+-----------------------------------------------------+
|first |second
|
+-----------------------------------------------------+-----------------------------------------------------+
|[beayres0@archive.org, Brose, Male, 1, Eayres, 3434,]|[beayres0@archive.org, Brose, Male, 2, Eayres, 3434,]|
+-----------------------------------------------------+-----------------------------------------------------+
要但不同 dfs 中的列,只需选择它们:
firstDataSet = mapped.select('first')
secondDataSet = mapped.select('second)
推荐阅读
- hive - 从非默认模式 Netezza 导入 Sqoop
- reactjs - 太多的重新渲染。React 限制渲染次数以防止无限循环
- c# - 向 Mailto 提交 mailto 字符串通常不起作用
- rust - 我们可以为所有包含特定类型的新类型结构实现特征吗?
- java - 调用@Sheduled 方法后未找到“强制”的现有事务
- r - 用数据框中的值替换向量的元素
- javascript - 从字符串重新实例化自定义类
- python - 显示无法与 pyvirtualdisplay 一起使用:“XStartTimeoutError:无法在显示“:1001”上启动 X(xdpyinfo 检查失败)”
- javascript - jQuery scrollTop 仅在 DevTools 在 Edge 中打开时有效
- bash - 这个 bash 行长度限制来自哪里?