Как загрузить каталог JSON-файлов в Apache Spark в Python

Я относительно новичок в Apache Spark, и я хочу создать один RDD в Python из списков словарей, которые сохраняются в нескольких файлах JSON (каждый из них gzipped и содержит список словарей). В результате RDD будет, грубо говоря, содержать все списки словарей, объединенных в один список словарей. Я не смог найти это в документации (https://spark.apache.org/docs/1.2.0/api/python/pyspark.html), но если я пропустил его пожалуйста, дайте мне знать.

до сих пор я пытался читать файлы JSON и создавать объединенный список в Python, а затем использовать sc.parallelize (), однако весь набор данных слишком велик, чтобы поместиться в памяти, поэтому это не практичное решение. Похоже, у Spark был бы умный способ обработки этого прецедента, но я этого не знаю.

Как я могу создать один RDD в Python, содержащий списки во всех файлах JSON?

Я должен также упомянуть, что я не хочу для использования Spark SQL. Я хотел бы использовать такие функции, как карта, фильтр и т. д., если это возможно.

4 ответов


после того, что tgpfeiffer упомянул в своем ответе и комментарии, вот что я сделал.

во-первых, как они упоминали, файлы JSON должны были быть отформатированы так, чтобы у них был один словарь на строку, а не один список словарей. Тогда все было просто:--2-->

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

Если есть лучший или более эффективный способ сделать это, пожалуйста, дайте мне знать, но это, кажется, работает.


можно использовать объект sqlcontext.jsonFile () чтобы получить SchemaRDD (который является RDD[Row] плюс схема), который затем может использоваться с Spark SQL. Или увидеть загрузка набора данных JSON в Spark, затем используйте фильтр, карту и т. д. для конвейера обработки, отличного от SQL. Я думаю, вам, возможно, придется распаковать файлы, а также Spark может работать только с файлами, где каждая строка является одним документом JSON (т. е. нет многострочных объектов).


вы можете загрузить каталог файлов в один RDD с помощью textFile, а также поддерживает подстановочные знаки. Это не даст вам имена файлов, но они вам, похоже, не нужны.

вы можете использовать Spark SQL при использовании основных преобразований, таких как карта, фильтр и т. д. SchemaRDD также является RDD (в Python, а также Scala)


загрузить список 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)