【问题标题】:Date filter in hive while doing left outer join在进行左外连接时在配置单元中进行日期过滤
【发布时间】:2017-09-01 00:53:08
【问题描述】:

我正在 hive 中构建查询,查询如下所示。

*

Select * from CSS407 
LEFT OUTER JOIN PROD_CORE.SERV_ACCT_ISVC_LINK SASP
ON CSS407.TABLE_ABBRV_CODE = 'SACT'
AND CSS407.EVENT_ITEM_REF_NUM = SASP.Serv_Acct_Id
AND to_date(CSS407.EVENT_RTS_VAL) >= SASP.Acct_Serv_Pnt_Strt_Dt
AND to_date(CSS407.EVENT_RTS_VAL) <  SASP.Acct_Serv_Pnt_End_Dt 
LEFT OUTER JOIN PROD_CORE.CUST_ACCT_SA_LINK ASA
ON CSS407.TABLE_ABBRV_CODE = 'SACT'
AND CSS407.EVENT_ITEM_REF_NUM = ASA.Serv_Acct_Id
AND CSS407.EVENT_RTS_VAL_UTC_DTTM >= ASA.Acct_Relt_Strt_Dttm
AND CSS407.EVENT_RTS_VAL_UTC_DTTM <  ASA.Acct_Relt_End_Dttm
LEFT OUTER JOIN PROD_CORE.CUST_SA_LINK ASAT
ON CSS407.TABLE_ABBRV_CODE = 'TACT'
AND CSS407.EVENT_ITEM_REF_NUM = ASAT.Serv_Acct_Id
AND CSS407.EVENT_RTS_VAL_UTC_DTTM >= ASAT.Acct_Relt_Strt_Dttm
AND CSS407.EVENT_RTS_VAL_UTC_DTTM <  ASAT.Acct_Relt_End_Dttm

*

当我在 hive 中执行上表时,出现以下错误

“在 JOIN 'SASP' 中遇到左右别名”

经过进一步调查,我发现我们不能在条件连接中使用过滤器之间的日期。在每个帖子中,每个人都要求在 where 条件下插入该过滤器。

但在我们的例子中,如果我们将过滤器之间的日期移动到 where 条件,那么我们将不会获得任何数据,因为左外连接不令人满意。

我在 HIVE 中执行时遇到了这个问题,它在 Teradata 和 oracle 中运行良好

请帮忙。

【问题讨论】:

  • 请分享真正的 SELECT 子句(可能不是Select *),因为除了使用多个 LEFT JOIN 之外,可能还有其他解决方法
  • 附言。我假设您从每个连接的表中获得一条记录?
  • 您的联接表是否有主键?
  • 我在 HIVE 中执行它时遇到了这个问题,如果我们在 Teradata 中执行相同的查询它正在工作
  • 这是 Hive 限制。如果您能回答我的问题,我可能会为您提供解决方法。

标签: sql hadoop join hive hue


【解决方案1】:

只有相等(=)在 Hive 的连接条件下有效。将 移动到 where 子句。

我之前也有类似的问题。请查看下面的帖子。

Hive Select MAX() in Join Condition

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    CSS407 和 SERV_ACCT_ISVC_LINK 之间可能存在一些共同的列,这可能会导致此错误。

    【讨论】:

    • 不,因为我们正在选择 * 它不会产生任何问题,而且我们为所有列提供了别名
    猜你喜欢
    • 1970-01-01
    • 2021-04-13
    • 2014-12-10
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多