gpt4 book ai didi

java - 具有两个值的键的最佳实践

转载 作者:行者123 更新时间:2023-12-02 03:06:18 24 4
gpt4 key购买 nike

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

最佳答案

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

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

-使用 map 为国家创建JavaPairDStream:<key, country> ,然后申请.distinct( ).reduceByKey( )里面.transformToPair(...)使用 <key, distinct country count> 获取 JavaPairDStream (我们称之为 <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")

关于java - 具有两个值的键的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57021493/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com