scala - 负逻辑实现不适用于spark/scala

标签 scala hadoop apache-spark join spark-dataframe

Hive中的减号逻辑:

下面的(Hive)查询将仅返回左侧表(Full_Table ft)中可用的记录,但不会同时返回这两个记录。

Select ft.* from Full_Table ft  left join Stage_Table stg where stg.primary_key1 IS  null and stg.primary_key2 IS null

我试图使用以下方法在spark / scala中实现相同的功能(同时支持主键和复合键),但是联接的结果集没有来自右表的column,因为它无法在联接的结果集中应用stg.primary_key2 IS null条件。
ft.join(stg,usingColumns, “left_outer”)  // used seq to support composite key column join

请建议我如何在spark scala中实现减号逻辑。

谢谢,
萨拉瓦南
https://www.linkedin.com/in/saravanan303/

最佳答案

如果表具有相同的列,则可以使用except中的DataSet方法:

fullTable.except(stageTable)

如果它们没有,但您仅对两个表中都存在的列子集感兴趣,则可以先使用select转换选择这些列,然后再使用except:
val fullTableSelectedColumns = fullTable.select(c1,c2,c3)
val stageTableSelectedColumns = stageTable.select(c1,c2,c3)

fullTableSelectedColumns.except(stageTableSelectedColumns)

在其他情况下,可以使用joinfilter转换:
fullTable
    .join(stageTable, fullTable("primary_key") === stageTable("primary_key"), "left")
    .filter(stageTable("primary_key1").isNotNull) 

关于scala - 负逻辑实现不适用于spark/scala,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44642403/

相关文章:

scala - 流静态加入 : How to refresh (unpersist/persist) static Dataframe periodically

hadoop - Hive 字段分隔符作为固定偏移量

java - 不了解 MapReduce NPE

Hadoop:数据节点如何注册到名称节点?

apache-spark - pySpark 本地模式 - 使用文件 :///vs relative path 加载文本文件

scala - 如何将 Iterable 转换为 RDD

scala - Scala到底有多纯洁和懒惰?

scala - 如何在 Play-Mailer 中设置 JavaMail 属性

apache-spark - 过滤 pyspark 数据帧以保留包含至少 1 个空值的行(保留,而不是删除)

r - 如何使用 spark_apply_bundle