0

到目前为止,我有一个 JavaDStream,它最初看起来像这样:

Value
---------------------
a,apple,spain
b,orange,italy
c,apple,italy
a,apple,italy
a,orange,greece

首先,我拆分了行并将其映射到 JavaPairDStream 中的键值对:

JavaPairDStream<String, String> pairDStream = inputStream.mapToPair(row -> {
    String[] cols = row.split(",");
    String key = cols[0];
    String value = cols[1] + "," + cols[2];

    return new Tuple2<String, String>(key, value);
});

所以我得到了这个:

Key  | Value
---------------------
a    | apple,spain
b    | orange,italy
c    | apple,italy
a    | apple,italy
a    | orange,greece

最后,输出应该是这样的

Key  | Fruit | Country
-------------------------------
a    | 2     | 3
b    | 1     | 1
c    | 1     | 1

它计算每个键的独特水果和国家的数量。

现在最好的做法是什么?首先 groupByKey/reduceByKey 然后再拆分?或者是否可以像这样的键值对中的每个键有两个值?:

Key  | Value1 | Value2
----------------------
a    | apple  | spain
b    | orange | italy
c    | apple  | italy
a    | apple  | italy
a    | orange | greece
4

1 回答 1

0

无法使用 JavaPairDStream 获取不同的值,因此您需要使用它的.transformToPair(...)方法先将其转换为 JavaPairRDD,然后获取不同的行,然后按键减少,最后将其转换回 JavaPairDStream

- 使用 map 为水果制作 JavaPairDStream: <key, fruit>,然后 .distinct( ).reduceByKey( )在里面应用.transformToPair(...)以获取 JavaPairDStream <key, distinct fruit count> (我们称之为<prds1>

- 使用地图为国家/地区制作JavaPairDStream:,<key, country>然后 .distinct( ).reduceByKey( )在里面申请.transformToPair(...)以获取JavaPairDStream <key, distinct country count> (我们称之为<prds2>

- 按键加入: <key, distinct fruit count, distinct country count>:(申请prds1.join(prds2)

以供将来参考,如果您希望使用 Spark 的 Dataframe 类做同样的事情:

- 从给定的输入数据中创建一个数据框(假设它有 3 列称为<key, fruit, country> (调用它 df

-选择键和水果,应用不同的然后按键分组:(df.select("key", "fruit").distinct( ).groupBy("key").sum("fruit") 调用结果数据框df1

-选择键和国家,应用不同的然后按键分组:(df.select("key", "country").distinct( ).groupBy("key").sum("country") 调用结果数据框df2

- 通过键加入 df1 和 df2:df1.join(df2, col("key").equalTo(col("key")), "inner")

于 2019-07-13T20:47:56.700 回答