我是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编写的序列文件中返回的其他自定义对象?