ヤニMOTHER:
私は後のため、重複の我々は複数のレコードを持って結合条件をJavaを使用して火花コード、に取り組んでいますIDs
さまざまなソースで、(ID
重複しているが、いくつかの属性が変更された)ので、同じIDを持つ我々は、複数のrecords.what Iの必要性を持っているどの組み合わせることですそれぞれのための単一のユニークな行のにレコードを複製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個の列を持っています。
Yashwanth Kambala:
スパークに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] |
+---+--------------+--------------+--------------+-------------------+--------------+