Pyspark JSON对象或文件到RDD

时间:2017-04-21 20:40:20

标签: python json pyspark rdd

我是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中的一行。我该怎么做呢?

2 个答案:

答案 0 :(得分:2)

您可以使用SparkSQL的read.json来读取文件,如 -

jdf = spark.read.json("path/to/AskReddit.json")

并执行所有类型的sql类型的操作,甚至对它执行rdd类型的操作。但json struture实际上是嵌套的,没有固定列,可以使用explode

之类的东西派生

Json Structure 您最好使用read.json并使用数据框 -

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,因为我相信您提到过。