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

How to load directory of JSON files into Apache Spark in Python

我对 Apache Spark 比较陌生,我想在 Python 中从保存在多个 JSON 文件中的字典列表中创建一个 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。如果可能的话,我想使用地图、过滤器等功能。

您可以将 sqlContext.jsonFile() to get a SchemaRDD (which is an RDD[Row] plus a schema) that can then be used with Spark SQL. Or see 用于非 SQL 处理管道。我认为您可能必须解压缩文件,而且 Spark 只能处理每行都是单个 JSON 文档的文件(即,不可能有多行对象)。

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

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

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

首先,正如他们所提到的,必须对 JSON 文件进行格式化,以便每行有一个字典,而不是一个字典列表。然后,就这么简单:

my_RDD_strings = sc.textFile(path_to_dir_with_JSON_files)
my_RDD_dictionaries = my_RDD_strings.map(json.loads)

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

从文件加载 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)