Spark Streaming在PairDStream中为每个键获取一个元素

时间:2016-06-09 14:48:01

标签: java apache-spark spark-streaming

简单的问题:任何实际有效的方法来获得每个密钥由一个键值对组成的dstream?伪代码:

myKeyValueDStream = {(A,miao-1-3),
(A,miao-2-4),
(A,miao-5-6),
(B,bau-1-2),
(B,bau-3-4),
(C,cip-1-2),
(C,cip-3-4)}
singleLineDStream = myKeyValueDStream.takeOneElementPerKey();
//I don't care which one; the first one would be fine
singleLineDStream.print() // {(A,miao-1-3),(B,bau-1-2),(C,cip-1-2)}

我现在的解决方案(对Java 7道歉):

JavaPairDstream<String,String[]> singleLineDStream = pairdDstream.reduceByKey(new Function2<String[],String[],String[]>(){
        @Override
        public String[] call(String[] arg0, String[] arg1) throws Exception {
            return arg0;
        }
    });

是否有更好的方法为每个键获取一个元素?使用您想要的任何语言的解决方案。

2 个答案:

答案 0 :(得分:0)

可以做的一件事是在RDD上使用 CollectAsMap 函数将其用作包含集合中每个键的一个值的Dictionary。之后,可以将字典转换为具有键值对的列表。

与此Pyspark Code Image

一样

答案 1 :(得分:0)

我会信任maasg,并说我确实在我的问题中给出了答案:

JavaPairDstream<String,String[]> singleLineDStream = pairdDstream.reduceByKey(new Function2<String[],String[],String[]>(){
    @Override
    public String[] call(String[] arg0, String[] arg1) throws Exception {
        return arg0;
    }
});