У меня была похожая проблема, и кажется, что я нашел способ:
1. Получить список файлов
2. Распараллелить этот список (распределить по всем узлам)
3. напишите функцию, которая читает содержимое всех файлов из части большого списка, которая была распространена на узел
4. запустите его с mapPartition, затем соберите результат в виде списка, каждый элемент представляет собой собранное содержимое каждого файла.
Файлы FOT, хранящиеся в файлах AWS s3 и json:
def read_files_from_list(file_list):
#reads files from list
#returns content as list of strings, 1 json per string ['{}','{}',...]
out=[]
for x in file_list:
content = sp.check_output([ 'aws', 's3', 'cp', x, '-']) # content of the file. x here is a full path: 's3://bucket/folder/1.json'
out.append(content)
return out #content of all files from the file_list as list of strings, 1 json per string ['{}','{}',...]
file_list=['f1.json','f2.json',...]
ps3="s3://bucket/folder/"
full_path_chunk=[ps3 + f for f in file_list] #makes list of strings, with full path for each file
n_parts = 100
rdd1 = sc.parallelize(full_path_chunk, n_parts ) #distribute files among nodes
list_of_json_strings = rdd1.mapPartitions(read_files_from_list).collect()
Затем, при необходимости, вы можете создать искровой фрейм данных следующим образом:
rdd2=sc.parallelize(list_of_json_strings) #this is a trick! via http://spark.apache.org/docs/latest/sql-programming-guide.html#json-datasets
df_spark=sqlContext.read.json(rdd2)
Функция read_files_from_list является лишь примером, ее следует изменить, чтобы читать файлы из hdfs с помощью инструментов python.
Надеюсь, это поможет:)