Java 在apachesparksql的dataframes中,避免在具有相同域的多个列的特定情况下进行多个连接
我被要求通过dataframes在ApacheSparkSQL(JavaAPI)中做一些事情,我认为如果按照一种简单的方法执行,这将花费很多(我仍在使用简单的方法,但我认为这将花费很多,因为它至少需要4种连接) 我得到了以下数据帧:Java 在apachesparksql的dataframes中,避免在具有相同域的多个列的特定情况下进行多个连接,java,apache-spark,apache-spark-sql,mapreduce,Java,Apache Spark,Apache Spark Sql,Mapreduce,我被要求通过dataframes在ApacheSparkSQL(JavaAPI)中做一些事情,我认为如果按照一种简单的方法执行,这将花费很多(我仍在使用简单的方法,但我认为这将花费很多,因为它至少需要4种连接) 我得到了以下数据帧: +----+----+----+----+----+----------+------+ | C1| C2| C3| C4| C5|UNIQUE KEY|points| +----+----+----+----+----+----------+------
+----+----+----+----+----+----------+------+
| 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具有相同的域值,unique key是唯一的key,points是一个整数,对应C列的每个不同值只应考虑一次(例如,对于第一行a、a、null、null、null、null、key,2与a、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|
+----+------+
我打算通过简单的。选择(“C1”,“point”)
,。选择(“C2”,“point”)
等等,将数据帧分成多个小数据帧(1列表示C列,1列表示点)。但我相信,如果数据量真的很大的话,这会花费很多,我相信应该有一些通过map reduce的技巧,但是我自己找不到,因为我对这个世界还是新手。我想我缺少了一些关于如何应用map reduce的概念
我还考虑过使用explode函数,我想把[C1,C2,C3,C4,C5]放在一列中,然后使用explode,所以每行有5行,然后按键分组。。。但我相信这会在某个时候增加数据量,如果我们谈论的是GBs,这可能是不可行的。。。。我希望你能找到我要找的诀窍
谢谢您的时间。使用
explode
可能是一种方法。与使用多个连接
(请注意,单个连接
本身是一个昂贵的操作)相比,它不会增加数据量,并且在计算上更有效
在这种情况下,可以将列转换为数组,只保留每个单独行的唯一值。然后可以分解此数组并过滤掉所有空值。此时,一个简单的groupBy
和sum将为您提供所需的结果
在Scala中:
df.选择(分解(不同的数组(数组(“C1”、“C2”、“C3”、“C4”、“C5”)))。作为(“C1”),$“点”)
.filter($“C1”。不为空)
.groupBy($”C1)
.agg(总和($“点数”).as(“点数”)
.sort($“C1”)//实际上不需要
这将为您提供想要的结果:
+----+------+
| C1|points|
+----+------+
| A| 8|
| B| 4|
| C| 3|
| D| 1|
| E| 4|
| F| 2|
| G| 2|
| H| 3|
+----+------+
explode
不会增加数据吗?我想行会增加,但数据量的含义是什么?@Lamanus:行数会暂时增加(在groupby之前),但列数会减少(这里,从7到2)表中包含的信息将是相同的。在这里可以找到一些关于大数据爆炸的提示:我喜欢数组_distinct的想法(我不知道有这样的想法),它比我所想的要好得多(我原以为数据量将在x4-x5左右)但我的情况是x2.3,我刚刚看了stackoverflow.com/questions/52777421/中建议的视频,我想这是可以达到的最佳效果,是的,我同意这在计算上更有效。谢谢