【问题标题】:Best practice for key with two values具有两个值的键的最佳实践
【发布时间】:2019-07-13 17:41:39
【问题描述】:

到目前为止,我有一个 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

【问题讨论】:

  • 第二个值也可以是Tuple:Tuple2>

标签: java apache-spark dstream


【解决方案1】:

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

-使用map为水果制作JavaPairDStream:&lt;key, fruit&gt;,然后在.transformToPair(...)中应用.distinct( ).reduceByKey( ),得到带有&lt;key, distinct fruit count&gt;的JavaPairDStream(我们称之为&lt;prds1&gt;

-使用地图为国家/地区制作JavaPairDStream:&lt;key, country&gt;,然后在.transformToPair(...)中应用.distinct( ).reduceByKey( )以获取带有&lt;key, distinct country count&gt;的JavaPairDStream(我们称之为&lt;prds2&gt;

-按键加入:&lt;key, distinct fruit count, distinct country count&gt;:(申请prds1.join(prds2)

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

-从给定的输入数据中创建一个数据框(假设它有 3 列称为&lt;key, fruit, country&gt;(称之为 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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 2017-05-24
    • 2021-07-05
    • 1970-01-01
    • 2023-04-03
    • 2018-11-01
    • 2014-01-05
    相关资源
    最近更新 更多