基本上,我想检查与昨天的文件相比,新文件中是否有任何更新的记录。例如。我有两个文件,“备份文件”和“当前文件”,我正在创建两个数据帧,即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"))
是否存在用于检查所有列的通用代码。基本上我不想对列名进行硬编码?
答案 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)---瞧