我是 PySpark 的新手,我有一个从 this link 获得的 AskReddit json 文件.我正在尝试创建一个 RDD,然后我希望它执行诸如 map 和平面图之类的操作。我被建议以 jsonlines 格式获取 json,但尽管使用 pip 安装 jsonlines,但我无法在 PySpark 笔记本中导入包。以下是我尝试在 json 中阅读的内容。
In [10]: import json
data = json.load(open("AskReddit.json", "r"))
jsonrdd = sc.parallelize(data)
jsonrdd.take(5)
Out[11]: [u'kind', u'data']
我还尝试执行以下操作,它在执行 jsonrdd.take(1) 后为我提供了 json 文件的全部内容。
In [6]: jsonrdd = sc.wholeTextFiles("*.json")
jsonrdd.take(1)
但是,我想将每个 json 对象作为 rdd 中的一行。我该怎么做?
最佳答案
您可以使用 SparkSQL 的 read.json
读取文件,如 -
jdf = spark.read.json("path/to/AskReddit.json")
并执行所有类型的 sql 类型的操作,甚至是 rdd 类型的操作。但是 json 结构确实是嵌套的,没有固定的列,可以用 explode
之类的东西派生
jdf\
.withColumn('after',jdf.data.after)\
.withColumn('before',jdf.data.before)\
.withColumn('modhash',jdf.data.modhash)\
.withColumn('NestedKind',explode(jdf.data.children.kind))\
.withColumn('subreddit',explode(jdf.data.children.data.subreddit))\
.withColumn('clicked',explode(jdf.data.children.data.clicked))\
.show()
+--------------------+-------+---------+------+--------------------+----------+---------+-------+
| data| kind| after|before| modhash|NestedKind|subreddit|clicked|
+--------------------+-------+---------+------+--------------------+----------+---------+-------+
|[t3_66qv3r,null,W...|Listing|t3_66qv3r| null|3r7ao0m7qiadae13d...| t3|AskReddit| false|
|[t3_66qv3r,null,W...|Listing|t3_66qv3r| null|3r7ao0m7qiadae13d...| t3|AskReddit| false|
关于python - Pyspark JSON 对象或文件到 RDD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43551670/