Spark reduceByKey函数似乎无法使用单个键

时间:2018-01-12 03:11:10

标签: java apache-spark

我在mysql中有5行记录,比如

  1. sku:001卖方:A股:英国保证金:10
  2. sku:002卖家:B股票:美国保证金:5
  3. sku:001卖方:A股:英国保证金:10
  4. sku:001卖方:A股:英国保证金:3
  5. sku:001卖方:A股:英国保证金:7
  6. 我将这些行读入spark并将其转换为

    JavaPairRDD<Tuple3<String,String,String>, Map>(<sku,seller,stock>, Map<margin,xxx>).
    

    似乎到目前为止工作正常。

    但是,当我使用reduceByKey函数将边距求和为结构时:

    JavaPairRDD<Tuple3<String,String,String>, Map>(<sku,seller,stock>, Map<marginSummary, xxx>).
    

    最终结果得到了2个元素

    JavaPairRDD<Tuple3<String,String,String>, Map>(<sku,seller,stock>, Map<margin,xxx>).
    JavaPairRDD<Tuple3<String,String,String>, Map>(<sku,seller,stock>, Map<marginSummary, xxx>).
    

    似乎row2没有进入reduceByKey函数体。我想知道为什么?

1 个答案:

答案 0 :(得分:0)

预期结果。仅当合并单个键的对象时才会调用func。如果只有一个键,则没有理由调用它。

不幸的是,看起来你有一个更大的问题,可以从你的问题中推断出来。您正尝试更改reduceByKey中值的类型。一般来说,它甚至不应该编译为reduceByKey需要Function2<V,V,V> - 输入和输出类型必须相同。

如果要更改类型,则应使用combineByKey

public <C> JavaPairRDD<K,C> combineByKey(Function<V,C> createCombiner,
                                     Function2<C,V,C> mergeValue,
                                     Function2<C,C,C> mergeCombiners)

aggregateByKey

public <U> JavaPairRDD<K,U> aggregateByKey(U zeroValue,
                                       Function2<U,V,U> seqFunc,
                                       Function2<U,U,U> combFunc)

两者都可以更改类型并修复当前问题。有关示例,请参阅Java测试套件:12