我有一个大文件,格式如下
sample name t index t score
我正在尝试使用Hadoop Streaming根据样本名称拆分这个文件。我提前知道有多少样品,所以可以指定我需要多少减速器。这个帖子正在做一些非常相似的事情,所以我知道这是可能的。
我尝试使用以下脚本将此文件拆分为16个文件(共有16个样本)
hadoop jar $STREAMING
-D mapred.text.key.partitioner.options=-k1,1
-D stream.num.map.output.key.fields=2
-D mapred.reduce.tasks=16
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner
-mapper cat
-reducer org.apache.hadoop.mapred.lib.IdentityReducer
-input input_dir/*part* -output output_dir
这在一定程度上起作用——有些文件只包含一个示例名称。但是,大多数part*文件都是空白的,有些part*文件包含多个样本名称。
有没有更好的方法来确保每个reducer只有一个样本名称?
FYI,实际上有一种更干净的方法可以使用自定义OutputFormat 分割文件
这个链接描述了如何真正做好这件事。我最终为我的特定应用程序定制了另一个链接。总之,它只是Java 的几行额外的代码