我在HDFS中有两个不同数据格式的文件。如果我需要跨两个数据文件进行缩减,作业设置会是什么样子?
例如,想象一下常见的字数统计问题,在一个文件中,您有空格作为世界分隔符,而在另一个文件中有下划线。在我的方法中,我需要为各种文件格式提供不同的映射器,而不是馈送到一个通用的化简器中。
怎么做?还是有比我更好的解决方案?
查看解决这个确切问题的MultipleInputs
类。它非常整洁 - 您可以传递InputFormat
和可选的Mapper
类。
如果你在谷歌上寻找代码示例,搜索"减少端连接",这是通常使用此方法的地方。
另一方面,有时我发现使用黑客更容易。例如,如果您有一组空格分隔的文件,另一组文件下划线分隔,则使用相同的映射器和TextInputFormat
加载这两个文件,并在两个可能的分隔符上进行标记化。计算两个结果集中的令牌数。在字数统计示例中,选择具有更多标记的那个。
如果两个文件是相同的分隔符,但具有不同数量的标准列,这也有效。您可以在逗号上标记化,然后查看有多少令牌。如果是 5 个代币,它来自数据集 A,如果是 7 个代币,它来自数据集 B。