如何在Python中将JSON文件的目录加载到Apache Spark中

时间:2015-01-28 21:59:11

标签: python json dictionary apache-spark

我对Apache Spark比较陌生,我想从保存在多个JSON文件中的字典列表中创建Python中的单个RDD(每个都是gzip并包含字典列表)。然后,粗略地说,生成的RDD将所有字典列表合并为单个字典列表。我在文档(https://spark.apache.org/docs/1.2.0/api/python/pyspark.html)中找不到这个,但如果我错过了,请告诉我。

到目前为止,我尝试读取JSON文件并在Python中创建组合列表,然后使用sc.parallelize(),但是整个数据集太大而无法放入内存中,因此这不是一个实用的解决方案。看起来Spark会有一种处理这个用例的聪明方法,但我并不知道。

如何在Python中创建一个包含所有JSON文件中的列表的RDD?

我还应该提一下,我不想使用Spark SQL。如果可能的话,我想使用地图,过滤器等功能。

4 个答案:

答案 0 :(得分:5)

按照tgpfeiffer在回答和评论中提到的内容,这就是我的所作所为。

首先,正如他们所提到的,JSON文件必须格式化,因此每行有一个字典而不是单个字典列表。然后,它就像:

一样简单
my_RDD_strings = sc.textFile(path_to_dir_with_JSON_files)
my_RDD_dictionaries = my_RDD_strings.map(json.loads)

如果有更好或更有效的方法,请告诉我,但这似乎有效。

答案 1 :(得分:2)

您可以使用sqlContext.jsonFile()来获取SchemaRDD(这是一个RDD [Row]加上一个模式),然后可以与Spark SQL一起使用。或者查看Loading JSON dataset into Spark, then use filter, map, etc以获取非SQL处理管道。我认为您可能需要解压缩文件,而且Spark只能处理每行是单个JSON文档的文件(即,不能使用多行对象)。

答案 2 :(得分:1)

您可以使用textFile将文件目录加载到单个RDD中,并且它还支持通配符。这不会给你文件名,但你似乎不需要它们。

您可以在使用基本转换(如map,filter等)时使用Spark SQL.SchemaRDD也是一个RDD(在Python中,以及Scala)

答案 3 :(得分:1)

从文件中加载Json列表RDD

def flat_map_json(x): return [each for each in json.loads(x[1])]   
rdd = sc.wholeTextFiles('example.json').flatMap(flat_map_json)