我在mysql中有5行记录,比如
我将这些行读入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函数体。我想知道为什么?
答案 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)