【问题标题】:Using Case statement in Spark Dataframe in join condition在连接条件下使用 Spark Dataframe 中的 Case 语句
【发布时间】:2020-08-31 23:15:25
【问题描述】:

如何在 spark 中加入两个数据帧时使用 case 条件。

    var date_a = s"CASE WHEN month(to_date(from_unixtime(unix_timestamp(dt, 'dd-MM-yyyy')))) 
    IN  (01,02,03) THEN CONCAT(CONCAT(year(to_date(from_unixtime(unix_timestamp(dt, 'dd-MM-yyyy'))))-1,'-')
    ,substr(year(to_date(from_unixtime(unix_timestamp(dt, 'dd-MM-yyyy')))),3,4)) 
    ELSE CONCAT(CONCAT(year(to_date(from_unixtime(unix_timestamp(dt, 'dd-MM-yyyy')))),'-'),
    SUBSTR(year(to_date(from_unixtime(unix_timestamp(dt, 'dd-MM-yyyy'))))+1,3,4)) END"

    val gstr1_amend = df1.join(gstr1_amend_lkup_data, df1("date_b") === df2(date_a))

但我得到的错误案例不是一列。

【问题讨论】:

  • 你还在面对这个问题吗?

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


【解决方案1】:

我遇到了类似的情况,差异很小,我想使用第二个数据框中的列,以防第一列中的列为空白,这只能在加入时完成。无法使用案例,但在另一个键列上加入并在过滤器中使用案例。不是优雅的解决方案,但有效。

【讨论】:

    【解决方案2】:

    不要在连接条件中添加case statement,而是在withColumn 中使用when & otherwise 函数添加所有条件,然后在连接条件中使用相同的列,如下所示。

    val df2 = somedf
    .withColumn("date_a",when([...]).otherwise([...])) // [...] is your case statement logic
    
    val gstr1_amend = df1.join(df2, df1("date_b") === df2("date_a"))
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-20
      • 2015-11-04
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多