Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在apachesparksql的dataframes中,避免在具有相同域的多个列的特定情况下进行多个连接_Java_Apache Spark_Apache Spark Sql_Mapreduce - Fatal编程技术网

Java 在apachesparksql的dataframes中,避免在具有相同域的多个列的特定情况下进行多个连接

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

我被要求通过dataframes在ApacheSparkSQL(JavaAPI)中做一些事情,我认为如果按照一种简单的方法执行,这将花费很多(我仍在使用简单的方法,但我认为这将花费很多,因为它至少需要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具有相同的域值,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/中建议的视频,我想这是可以达到的最佳效果,是的,我同意这在计算上更有效。谢谢