我想用java在hadoop的mapreduce“key-value-pairs”类中设置多个列作为键,多个列作为值,从中读取的文件包含20个列。谢谢
mhd8tkvw1#
将要作为键和值发出的所有列合并为带分隔符的字符串并作为文本发出。假设您的输入如下所示:不,姓名,年龄,国家1,塔里克,25岁,印度2,萨米,25,xyz您希望发出“no+age”作为键,“name+country”作为值。
public static class MyMapper extends Mapper<LongWritable, Text, Text, Text> { String line = ""; String val = ""; String[] parts; String key = ""; public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { line = value.toString(); parts = line.split(","); key = parts[0] + "." + parts[2]; val = parts[1] + "." + parts[3]; context.write(new Text(key), new Text(value)); } }
dl5txlt92#
你可以做一个复合物体 implements WritableComparable<YourClassName> 以简洁的形式把钥匙存储在一起。请参阅此链接以获取一个好的示例。但是,考虑到您需要20个组件,我可能建议只使用一个 Text 对象,并在适当时对其进行分析。我经常使用制表符分隔的值,并使用定制的tsv解析器对它们进行解析,但只是将 Text.toString() 使用合适的分隔符 char 应该足够了。
implements WritableComparable<YourClassName>
Text
Text.toString()
char
2条答案
按热度按时间mhd8tkvw1#
将要作为键和值发出的所有列合并为带分隔符的字符串并作为文本发出。
假设您的输入如下所示:
不,姓名,年龄,国家
1,塔里克,25岁,印度
2,萨米,25,xyz
您希望发出“no+age”作为键,“name+country”作为值。
dl5txlt92#
你可以做一个复合物体
implements WritableComparable<YourClassName>
以简洁的形式把钥匙存储在一起。请参阅此链接以获取一个好的示例。但是,考虑到您需要20个组件,我可能建议只使用一个
Text
对象,并在适当时对其进行分析。我经常使用制表符分隔的值,并使用定制的tsv解析器对它们进行解析,但只是将Text.toString()
使用合适的分隔符char
应该足够了。