在特定情况下避免在Apache Spark sql数据框中使用具有相同域的多个列的多个联接

问题描述 投票:0回答:1

我被要求通过数据帧在apache spark sql(java api)中做某事,我认为如果按照幼稚的方法执行,我的确会花费很多(我仍在采用幼稚的方法,但是我认为这会花费很多很多,因为它至少需要4种联接)

我得到了以下数据框

+----+----+----+----+----+----------+------+
|  C1|  C2|  C3|  C4|  C5|UNIQUE KEY|points|
+----+----+----+----+----+----------+------+
|   A|   A|null|null|null|      1234|     2|
|   A|null|null|   H|null|      1235|     3|
|   A|   B|null|null|null|      1236|     3|
|   B|null|null|null|   E|      1237|     1|
|   C|null|null|   G|null|      1238|     1|
|   F|null|   C|   E|null|      1239|     2|
|null|null|   D|   E|   G|      1240|     1|
+----+----+----+----+----+----------+------+

C1,C2,C3,C4,C5具有相同的域值,唯一键是唯一键,点是一个整数,对于其相应C列的每个不同值(例如,对于第一行A, A,null,null,null,key,2与A,null,null,null,null,key,2或A,A,A,A,null,key,2相同)

我被要求“为每个现有的C值获取总点数”

因此输出应为:

+----+------+
|  C1|points|
+----+------+
|   A|     8|
|   B|     4|
|   C|     3|
|   D|     1|
|   E|     4|
|   F|     2| 
|   G|     2|
|   H|     3|
+----+------+

我打算通过简单的.select(“ C1”,“ point”).select(“ C2”,“ point”)将数据帧分成多个小块(C为1列,点为1列)但我相信,如果数据量真的很大,那确实会花费很多,我认为应该通过map reduce进行一些技巧,但是我找不到自己的人,因为我仍然是这个世界的新手我认为我缺少有关如何应用地图归约的一些概念。

[我也考虑过使用爆炸功能,我想将[C1,C2,C3,C4,C5]放到一列中,然后使用爆炸,这样我就得到了每行5行,然后我只是按键分组...但是我相信这会在某些时候增加数据量,如果我们谈论的是GB,这可能不可行。...希望您能找到我正在寻找的窍门。

感谢您的时间。

java apache-spark apache-spark-sql mapreduce
1个回答
0
投票

问题是您的结果表将忽略数据框中的重复项。如果您天真地按列分组并尝试对它们求和,则会遇到此问题(我已将所有null替换为“”):

© www.soinside.com 2019 - 2024. All rights reserved.