2017-01-27 8 views
0

У меня есть большой индексированный lzo-файл в HDFS, который я бы хотел прочитать в искровых информационных кадрах. Файл содержит строки json-документов.Чтение файла LZO строк json в Spark DataFrames

posts_dir='/data/2016/01' 

posts_dir имеет следующее:

/data/2016/01/posts.lzo 
/data/2016/01/posts.lzo.index 

следующие работы, но не использовать индекс и, следовательно, занимает много времени, потому что он использует только один картограф.

posts = spark.read.json(posts_dir) 

Есть ли способ заставить его использовать индекс?

ответ

0

Я решил это первое создание RDD, распознающий индекс, а затем, используя from_json функцию, чтобы превратить каждую строку в StructType, эффективно производить аналогичные результаты spark.read.json(...)

posts_rdd = sc.newAPIHadoopFile(posts_dir, 
           'com.hadoop.mapreduce.LzoTextInputFormat', 
           'org.apache.hadoop.io.LongWritable', 
           'org.apache.hadoop.io.Text') 

posts_df = posts_rdd.map(lambda x:Row(x[1]))\ 
        .toDF(['raw'])\ 
        .select(F.from_json('raw', schema=posts_schema).alias('json')).select('json.*') 

Я не знаю о лучшем или более простой способ.