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

如何在Python中将JSON文件的目录加载到ApacheSpark中,python,json,dictionary,apache-spark,Python,Json,Dictionary,Apache Spark,我对ApacheSpark比较陌生,我想从保存在多个JSON文件中的字典列表中创建一个Python RDD(每个都是gzip文件,包含一个字典列表)。然后,粗略地说,生成的RDD将包含所有字典列表,并组合成一个字典列表。我在文档()中找不到这个,但是如果我没有找到,请告诉我 到目前为止,我尝试读取JSON文件并用Python创建组合列表,然后使用sc.parallelize(),但是整个数据集太大,无法放入内存,因此这不是一个实用的解决方案。看起来Spark会有一个聪明的方法来处理这个用例,但我

我对ApacheSpark比较陌生,我想从保存在多个JSON文件中的字典列表中创建一个Python RDD(每个都是gzip文件,包含一个字典列表)。然后,粗略地说,生成的RDD将包含所有字典列表,并组合成一个字典列表。我在文档()中找不到这个,但是如果我没有找到,请告诉我

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

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


我还应该提到,我不想使用Spark SQL。如果可能的话,我想使用map、filter等函数。

您可以使用来获取SchemaRDD(这是一个RDD[Row]加上一个schema),然后可以与Spark SQL一起使用。有关非SQL处理管道,请参阅。我认为您可能必须解压缩文件,而且Spark只能处理每行都是单个JSON文档的文件(即,不可能有多行对象)。

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


您可以在使用map、filter等基本转换的同时使用sparksql。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)

谢谢你的回答。我应该提到,我不想使用Spark SQL,我想使用非SQL处理管道,就像您提到的问题一样。我将更新我的原始问题。您提到的问题的答案似乎是Scala,而不是Python。再次感谢你的帮助!没错,它是在Scala中实现的,但是这个想法可以应用于您的问题:使用
sparkContext.textFile()
(实际上是这样)加载输入数据集,然后使用您选择的解析器(例如)解析字符串行,然后根据您的意愿进行处理。谢谢,这很有效!关键步骤是在json.loads上使用map函数。我会把我所做的作为回答。非常感谢你的帮助。