Como llegar a valores de columna que se cambian después de GroupBy aplica?

Yani MADRE:

Estoy trabajando en un código de chispa usando Java, donde después de unirse a condición de que tenemos varios registros a causa de duplicado IDsen diferentes fuentes, ( IDson duplicados pero algún atributo cambiado) por lo que con el mismo id tenemos múltiples records.what que necesito es combinar los cuales son duplica los registros en ON sola fila única para cadaID

Conjunto de datos de entrada

+---+---+---+----+---+---+
|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 |
+---+---+---+----+---+---+

Rendimiento esperado

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


He intentado dar forma explícita collect_listde la siguiente

df.groupBy("id").agg(


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

                ).show(1,false);

Pero mi caso tenemos 300 columnas, en el conjunto de datos que también columnas pueden no ser iguales, cambiando algunas veces.

Yashwanth Kambala:

En Spark org.apache.spark.sqlpaquete, no hay agg(exprs: Map[String, String])método que acepta un Map<String,String>donde keyes el nombre de la columna y el valor es 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);


resultado

+---+--------------+--------------+--------------+-------------------+--------------+
|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]   |
+---+--------------+--------------+--------------+-------------------+--------------+


Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=314708&siteId=1
Recomendado
Clasificación