Hadoop中的通用元组

时间:2017-03-15 20:06:36

标签: scala hadoop apache-spark mapreduce apache-pig

我是Hadoop的新手,所以请不要严格判断我看似简单的问题。

简短版本:我可以在Hadoop中使用什么元组数据类型,将2个long作为单个值存储为序列文件? 此外,我希望能够使用 Apache Pig (例如A = LOAD '/my/file' AS (a:long, (b:long, c:long)))和 Scala&读取和处理此文件。 Spark ,如val a = sc.sequenceFile[LongWritable, DesiredTuple]("/my/file", 1)

全文:

我正在用Java编写Hadoop作业,我需要输出一个序列文件,每行包含3个长值。我使用第一个值作为键并将其他两个值组合在一起作为我的Reducer中的值。

我尝试了几种变体: 使用org.apache.hadoop.mapreduce.lib.join.TupleWritable

public class MyReducer extends Reducer<...> {
    public void reduce(Context context){
        long a,b,c;
        // ...
        context.write(a, new TupleWritable(
                new LongWritable[]{new LongWritable(b), new LongWritable(c)}));
    }
}

但是TupleWritable类的javadoc说“*这是不是通用元组类型。”第一次尝试似乎没问题,但我无法取回我的元组。看看Apace Pig中的一个简单脚本:

A = LOAD '/my/file' USING org.apache.pig.piggybank.storage.SequenceFileLoader() 
        AS (a:long, (b:long, t:long));
DUMP A;

我得到了这样的东西:

(2220,)
(5640,)
(6240,)
...

那么什么是Apache Pig从序列文件中读取Hadoop的TupleWritable的方法呢?

此外,我尝试将序列格式更改为文本格式:job.setOutputFormatClass(TextOutputFormat.class);

这次我只看了一个输出的文件:

> hdfs dfs -cat /my/file/part-r-00000 | head
2220    [,]
5640    [,]
6240    [,]
...

下一个问题是:为什么我的TupleWritable值中没有任何内容?

之后,我尝试了org.apache.mahout.cf.taste.hadoop.EntityEntityWritable。 对于序列文件,我得到了与之前相同的结果:

grunt> A = LOAD '/my/file' USING org.apache.pig.piggybank.storage.SequenceFileLoader() AS (a:long, (b:long, c:long));
(2220,)
(5640,)
(6240,)
...

对于文本文件,我得到了所需的结果:

2220    2   15
5640    1   9
6240    0   1
...

接下来的问题是:如何阅读这样的元组(EntityEntityWritable),可能是从Hadoop编写的序列文件中返回的其他自定义对象?

0 个答案:

没有答案