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 IDs
en diferentes fuentes, ( ID
son 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_list
de 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.
En Spark org.apache.spark.sql
paquete, no hay agg(exprs: Map[String, String])
método que acepta un Map<String,String>
donde key
es 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] |
+---+--------------+--------------+--------------+-------------------+--------------+