数据框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中填充与“最小日期”相对应的值
如何实现?
答案 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