将纯文本文件转换为Spark中的Hadoop序列文件

时间:2017-06-21 05:32:55

标签: java xml hadoop apache-spark mapreduce

我现有的项目正在使用Hadoop map-reduce生成一个序列文件,该文件具有自定义键和XML格式的值。

通过从输入源一次读取一行来生成XML值,并实现RecordReader以从纯文本中返回XML格式的下一个值。

e.g。输入源文件有3行(第1行是标题,其余行是实际数据)

id|name|value
1|Vijay|1000
2|Gaurav|2000
3|Ashok|3000

发布map方法,序列文件包含如下数据:

FeedInstanceKey{feedInstanceId=1000, entity=bars}   <?xml version='1.0' encoding='UTF-8'?><bars><id>1</id><name>Vijay</name><value>1000</value></bars>
FeedInstanceKey{feedInstanceId=1000, entity=bars}   <?xml version='1.0' encoding='UTF-8'?><bars><id>2</id><name>Gaurav</name><value>2000</value></bars>
FeedInstanceKey{feedInstanceId=1000, entity=bars}   <?xml version='1.0' encoding='UTF-8'?><bars><id>3</id><name>Ashok</name><value>3000</value></bars>

问题:我希望在Spark中实现相同的功能。基本上,读取输入文件并生成如上所述的键值对。

有没有办法/可能重用现有的InputFormat,从而重用我的Hadoop映射器类中使用的RecordReader。

RecordReader负责/拥有将纯文本行转换为XML并将其作为值返回到Hadoop map方法的逻辑,以便在context.write()方法中进行写入。

请建议。

1 个答案:

答案 0 :(得分:3)

这在External Datasets部分的Spark文档中有所介绍。对你来说重要的是:

  

对于其他Hadoop InputFormats,您可以使用   JavaSparkContext.hadoopRDD方法,它接受任意JobConf   和输入格式类,键类和值类。设置相同   使用输入源进行Hadoop作业的方式。你也可以   使用JavaSparkContext.newAPIHadoopRDD为基于的InputFormats   “新”MapReduce API(org.apache.hadoop.mapreduce)。

这是一个简单示例,说明如何使用它:

public final class ExampleSpark {

    public static void main(String[] args) throws Exception {
        JavaSparkContext spark = new JavaSparkContext();
        Configuration jobConf = new Configuration();

        JavaPairRDD<LongWritable, Text> inputRDD = spark.newAPIHadoopFile(args[0], TextInputFormat.class, LongWritable.class, Text.class, jobConf);
        System.out.println(inputRDD.count());

        spark.stop();
        System.exit(0);
    }
}

您可以看到Javadocs for JavaSparkContext here