如何合并Spark Scala数据框-根据条件将多行合并为一

时间:2020-08-28 10:54:27

标签: scala apache-spark apache-spark-sql

数据框1:

12345,B,C,2020-08-12,Internet
12345,B,D,2002-11-12,Mobile
12345,B,e,2003-10-12,Lap

数据框2

12345

我必须加入数据框1和数据框2,并为DF2中的每个记录在输出中为每个记录生成1行。我的输出应如下所示,

输出:

12345,Y,Y,2002-11-12,Mobile

列的条件,

颜色1-不同的值

颜色2-如果DF1的col2中的 ALL 值=='B',则在输出中填充'Y',否则填充'N'

颜色3-如果DF1的col3中的 ANY 值=='C',则在输出中填充'Y',否则填充'N'

颜色4-从DF1的col4中获取最小日期

颜色5-从DF1的颜色5中填充与“最小日期”相对应的值

如何实现?

1 个答案:

答案 0 :(得分:1)

通过使用 groupBy 然后 agg API,您可以轻松实现此目标。

import org.apache.spark.sql.functions._
import spark.implictis._
val dataframe2 = dataframe1.groupBy("_c0")
 .agg(when(size(array_distinct(collect_list('_c1))) === lit("1") and array_contains(array_distinct(collect_list('_c1)),'B'),lit("Y")).otherwise(lit("N"))
 ,when(array_contains(collect_list('_c1),'C'),lit("Y")).otherwise(lit("N"))
 ,min('_c3).alias("date"))
 

然后加入dataframe2.join(dataframe1,Seq("_c0","dateColumn"),"inner") 并从dataframe2(select(dataframe2("*")))中选择所有列,然后仅选择dataframe1(dataframe1("_c4")),您将获得所需的结果...

注意:请确保在加入之前正确别名dataframe2和dataframe1列

group by and aggregation中,您无法访问父DF的普通列。

否则 : 您可以将数据帧转换为rdd,然后将 rdd转换为pairedRdd ,然后可以对成对的RDD执行reduceByKey or aggregateByKey or groupByKey操作,并通过编写自定义代码来计算所有聚合