0

我在 HDFS 中有一个大型索引 lzo 文件,我想在 spark 数据帧中读取它。该文件包含多行 json 文档。

posts_dir='/data/2016/01'

posts_dir具有以下内容:

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

以下工作但不使用索引,因此需要很长时间,因为它只使用一个映射器。

posts = spark.read.json(posts_dir)

有没有办法让它利用索引?

4

1 回答 1

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.*')

我不知道更好或更直接的方法。

于 2017-01-27T05:37:39.133 回答