【问题标题】:How to get column values which are changed after groupby applied?如何获取应用 groupby 后更改的列值?
【发布时间】:2020-01-30 22:45:50
【问题描述】:

我正在使用 java 编写 spark 代码,在加入条件之后,我们得到了多条记录,因为在不同的来源中有重复的 IDs,(ID 是重复的,但某些属性已更改)所以使用相同的 id 我们有多个记录.我需要的是将哪些重复记录合并到每个ID的单个唯一行上

输入数据集

+---+---+---+----+---+---+
|id |b  |c  |d   |f  |g  |
+---+---+---+----+---+---+
|1  |e  |dd |ddd |34 |r5t|
|1  |e  |dd2|ddd |34 |r5t|
|1  |e  |dd3|ddd |34 |rt |
|2  |e  |dd |ddd1|34 |5rt|
|4  |e  |dd |ddd1|34 |rt |
|1  |e  |dd4|ddd |34 |rt |
|4  |e  |dd4|ddd |34 |rt |
|4  |e  |dd4|ddd |3  |rt |
|2  |e  |dd |ddd |3  |r5t|
|2  |e  |dd |ddd |334|rt |
+---+---+---+----+---+---+

预期输出

+---+--------------+--------------+--------------+-------------------+--------------+
|id |f             |            b |             g|d                  |d             |
+---+--------------+--------------+--------------+-------------------+--------------+
|1  |[34]          |[e]           |[r5t, rt]     |[dd4, dd3, dd2, dd]|[ddd]         |
+---+--------------+--------------+--------------+-------------------+--------------+


我尝试如下明确给出collect_list

df.groupBy("id").agg(


                 functions.collect_set("f"),
                 functions.collect_set("b")

                ).show(1,false);

但我的情况是我们有 300 列,在数据集中,列可能不一样,有时会发生变化。

【问题讨论】:

    标签: java apache-spark aggregate-functions


    【解决方案1】:

    在 Spark org.apache.spark.sql 包中,有一个 agg(exprs: Map[String, String]) 方法接受 Map<String,String> 其中key 是列名,值是 sql.functions。

    Dataset<Row> df = spark.read().format("csv").option("header", "true")
                    .load("...");
    
    Map<String,String> collect_MAP =  Arrays.stream(df.columns())
                .filter(f -> !f.equals("id"))
                .collect(Collectors.toMap(f -> f,f -> "collect_set"));
    
    
         df.groupBy("id").agg(collect_MAP).show(false);
    
    
    

    结果

    +---+--------------+--------------+--------------+-------------------+--------------+
    |id |collect_set(f)|collect_set(b)|collect_set(g)|collect_set(c)     |collect_set(d)|
    +---+--------------+--------------+--------------+-------------------+--------------+
    |1  |[34]          |[e]           |[r5t, rt]     |[dd4, dd3, dd2, dd]|[ddd]         |
    |4  |[3, 34]       |[e]           |[rt]          |[dd4, dd]          |[ddd1, ddd]   |
    |2  |[334, 3, 34]  |[e]           |[r5t, rt, 5rt]|[dd]               |[ddd1, ddd]   |
    +---+--------------+--------------+--------------+-------------------+--------------+
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-30
      • 2019-09-14
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      相关资源
      最近更新 更多