我是PySpark的新手,我有一个来自this link的AskReddit json文件。我正在尝试创建一个RDD,然后我希望执行map和flatmap等操作。我被建议以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中的一行。我该怎么做呢?
答案 0 :(得分:2)
您可以使用SparkSQL的read.json
来读取文件,如 -
jdf = spark.read.json("path/to/AskReddit.json")
并执行所有类型的sql类型的操作,甚至对它执行rdd类型的操作。但json struture实际上是嵌套的,没有固定列,可以使用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|
答案 1 :(得分:0)
假设您使用的是spark 2.0+,您可以执行以下操作:
df = spark.read.json(filename).rdd
查看pyspark.sql.DataFrameReader.json
的文档以获取更多详细信息。请注意,此方法需要JSON行格式或新行分隔的JSON,因为我相信您提到过。