【问题标题】:Minus logic implementation not working with spark/scala负逻辑实现不适用于 spark/scala
【发布时间】:2017-11-22 08:51:03
【问题描述】:

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/

【问题讨论】:

  • 喜欢只比较几个关键列,喜欢从左右表中选择所有列,但除了会考虑所有匹配的列,这不是预期的输出。有关详细信息,请参阅 Hive 查询。
  • 我已经修复了以下连接查询:val result = ft.join (stg, columnList.length match { case 2 => ft(columnList(0)) equalTo stg(columnList(0))和 ft(columnList(1))=== stg(columnList(1)) 案例 3 => ft(columnList(0)) 等于 stg(columnList(0)) 和 ft(columnList(1))=== stg( columnList(1)) 和 ft(columnList(2))=== stg(columnList(2)) 案例 1 => ft(columnList(0)) equalTo stg(columnList(0)) }, "left_outer").where (stg(columnList(0)).isNull) .select(targetTable + ".*") .unionAll(stg)

标签: scala hadoop apache-spark join spark-dataframe


【解决方案1】:

如果您的表具有相同的列,您可以使用来自DataSet 的except 方法:

fullTable.except(stageTable)

如果他们没有,但您只对两个表中存在的列子集感兴趣,您可以先使用select 转换选择这些列,然后使用except:

val fullTableSelectedColumns = fullTable.select(c1,c2,c3)
val stageTableSelectedColumns = stageTable.select(c1,c2,c3)

fullTableSelectedColumns.except(stageTableSelectedColumns)

在其他情况下,您可以使用join 和filter 转换:

fullTable
    .join(stageTable, fullTable("primary_key") === stageTable("primary_key"), "left")
    .filter(stageTable("primary_key1").isNotNull) 

【讨论】:

  • 喜欢只比较几个关键列,喜欢从左右表中选择所有列,但除了会考虑所有匹配的列,这不是预期的输出。有关更多详细信息,请参阅 Hive 查询。使用以下连接查询也可以实现相同的目的:
  • 正如我上面写的,如果你只想比较几列并全选,你可以使用join和filter。
猜你喜欢
  • 1970-01-01
  • 2018-02-22
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多