我如何在Hadoop数据集中找到键的所有组合



我的数据结构如下:

A, 23
B, 324235
C, 123
D, 213

示例字数映射器具有以下地图函数签名:

public void map(Object key, Text value, Context context
                    ) throws IOException, InterruptedException {

核心问题:

Text value只是输入文件或单个密钥的一行。如何一次访问所有键?似乎线(及其以后减少的扩展(不知道其他输入线

示例用法:

我希望输出所有ID的组合,这需要密钥"相互意识"

AB
AC
AD
BC
BD
CD

编辑:幼稚的方法/intuition

我认为完成它的一种方法是使用映射器将每行映射到同一键,然后在还原器

中映射到同一键

映射器的结果:

CONST_KEY, A
CONST_KEY, B
CONST_KEY, C
CONST_KEY, D

还原器:

public void reduce(Text key, Iterable<Text> values, Context context){
//PSEUDO CODE
  for(int i = 0; i < values.length; i++){
      for(int j = i+1; j < values.length; j++){
          String combo = concat(values[i], values[j]);
       }
  } 
}

但这似乎疯狂效率低下

我只会得到密钥,然后做一个嵌套以创建结果:

List<String> keys = new ArrayList<String>(yourmap.keySet());
List<String> results= new ArrayList<String>();
for(int i = 0; i < keys.length - 1; i++)
    for (int j = i+1; j < keys.length; j++)  {
        results.add(keys.get(i) + keys.get(j))
    }
}

您可能至少有三个选择来实现这一目标:

  1. WholeFileInputFormat

您可以编写自定义输入格式,该格式将整个文件作为记录。您可以在Tom Whites代码中为他的Hadoop书中的代码看到一个例子。

  1. 在映射器中保持状态

当每个记录进入映射器时,每个迭代都会生成新组合。或更简单的方法是将记录添加到列表中,一旦阅读了所有记录,请使用映射器的cleanup()方法生成所有组合。

  1. 使用还原器

您可以使用公共密钥从映射器发射每个条目,所有值将作为您可以迭代的值列表输入缩写。然后,您需要具有逻辑来生成所有组合。

问题确实在于,如果您有多个文件,因此多个并行运行的映射器,12不起作用。只要唯一的键将适合内存,3就可以工作。

最新更新