【问题标题】:Left outer Complex Join of Spark DataFrames using Seq("key") syntax使用 Seq("key") 语法的 Spark DataFrames 的左外复杂连接
【发布时间】:2017-10-12 06:44:21
【问题描述】:

我需要使用 dataframes 转换下面的 sql join。这个问题是我得到重复的“关键”列

val result_sql = sparkSession.sql(" select * from TAB_A a left outer join TAB_B b on a.key = b.key AND a.e_date between b.start_date and b.end_date ")

result_sql.printSchema()

root
|-- key: string (nullable = true)
|-- key: string (nullable = true)
|-- VAL: double (nullable = true)

所以我已经尝试过了,但得到了相同的重复列“key”

val result_df = TAB_A.join(TAB_B,TAB_A.col("key") === TAB_B.col("key")
                             && TAB_A.col("e_date").between(TAB_B.col("start_date"),TAB_B.col("start_date")),
                        "left_outer")

root
|-- key: string (nullable = true)
|-- key: string (nullable = true)
|-- VAL: double (nullable = true)

然后我尝试使用 Seq ,但无法实现复杂的连接并面临错误

val result_df = TAB_A.join(TAB_B,Seq("key") && TAB_A.col("e_date").between(TAB_B.col("start_date"),TAB_B.col("start_date")),
                        "left_outer")

预期架构:

root
|-- key: string (nullable = true)
|-- VAL: double (nullable = true)

在没有重复列的情况下实现上述逻辑的任何最佳解决方案。

注意:我正在寻找使用 spark 数据帧而不是 spark_sql 查询的解决方案。

【问题讨论】:

  • 一种替代方法是在加入后简单地删除key 列之一。

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


【解决方案1】:

SQL 的问题是,结果有来自两个连接表的同名的两列(键)。

解决方案 #1 为键分配不同的名称。
例如设置左表的列名为k1
设置右表的列名为k2

解决方案 #2 指定要保留在结果表中的列

SELECT a.*, b.val1, b.val2
FROM TAB_A a left outer join TAB_B b on a.key = b.key AND a.e_date between b.start_date and b.end_date 


// Since you you only want to keep one key, please change the code you have
val result_df = TAB_A.join(TAB_B,TAB_A.col("key") === TAB_B.col("key")
                         && TAB_A.col("e_date").between(TAB_B.col("start_date"),TAB_B.col("start_date")),
                    "left_outer")
// drop the key from TAB_B or TAB_A
val result_df = TAB_A.join(TAB_B,TAB_A.col("key") === TAB_B.col("key")
                         && TAB_A.col("e_date").between(TAB_B.col("start_date"),TAB_B.col("start_date")),
                    "left_outer").drop(TAB_B("key"))

【讨论】:

  • 我需要使用 spark 数据帧而不是 spark_sql 查询来实现解决方案
猜你喜欢
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
相关资源
最近更新 更多