如何从两个数据框d1和d2的联接中筛选出记录,其中d1中的所有列=!= d2中的所有对应列

时间:2018-06-28 10:21:37

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

基本上,我想检查与昨天的文件相比,新文件中是否有任何更新的记录。例如。我有两个文件,“备份文件”和“当前文件”,我正在创建两个数据帧,即bkpdataframe(别名“ bdf”)和currentdataframe(别名“ cdf”)。以下是我为更新记录编写的代码。

val joined= bdf.join(cdf,Seq("_c0"),"left")

val updatedRecords= joined.filter( (cdf("_c0").isNotNull && ( cdf("_c1") =!= bdf("_c1") || cdf("_c2") =!= bdf("c2"))

是否存在用于检查所有列的通用代码。基本上我不想对列名进行硬编码?

2 个答案:

答案 0 :(得分:0)

如果您的dataframe包含唯一的rows,则可以使用except函数。 except函数返回两个dataframes中不相似的记录,例如df1-df2

val updatedRecords=bdf.except(cdf).count
if(updatedRecords>0) println("Record updated") else println("Record Not updated")

如果要查找更新记录

val updatedRecDF=cdf.except(bdf)

答案 1 :(得分:0)

在比较两个必须具有相同签名(即,相同的列集和相同的列顺序)的数据集时,可以使其成为约束。

然后,您应该将连接列作为列表(jc_list)

然后,您可以像下面这样获得所需的输出:

jc_list1_df = bdf.select(jc_list) jc_list2_df = cdf.select(jc_list)

然后您可以比较它们并创建所需的输出。

delete_jc_df = jc_list1_df.except(jc_list2_df)---已删除的记录 new_jc_df = jc_list2_df.except(jc_list1_df)---新记录

然后,您可以将这些连接列与实际数据集连接起来以获取所有其他列。

delete_df = delete_jc_df.join(bdf,jc_list,“ inner”) insert_df = insert_jc_df.join(cdf,jc_list,“ inner”)

现在,如果要查找更新的记录,可以将jc_list1和jc_list2相交

jc_list_common = jc_list1.intersect(jc_list2)

现在您使用这些设置从cdf中获取所有其他列,

common_df = cdf.join(jc_list_common,jc_list,“内部”)

现在您可以在common_df和bdf之间执行减号操作,以仅获取更新的集合,

update_df = common_df.minus(bdf)---瞧