【问题标题】:Hive Where clause with subquery - Only SubQuery expressions that are top level conjuncts are allowed带有子查询的 Hive Where 子句 - 仅允许作为顶级连接的子查询表达式
【发布时间】:2021-05-14 21:27:26
【问题描述】:

我需要从 tableA 中获取大于存储在另一个 tmp_table 中的 cdc_date 的所有记录

tmp_table 只有一列 cdc_date 和只有一条记录。

tableA 有超过 500 万条记录。

我的 Hive 查询

Select count(*) from tableA as a 
where unix_timestamp((concat_ws('-',a.year,a.month,a.day,a.hour)),"yyyy-MM-dd-HH") > 
(select b.cdc_date from tmp_table as b)

我收到以下错误

Unsupported SubQuery Expression 'cdc_date': Only SubQuery expressions that are top level conjuncts are allowed

谁能建议如何激活它。

【问题讨论】:

    标签: hive subquery where-clause non-equi-join


    【解决方案1】:

    你需要重写sql -

    Select count(*) from tableA as a 
    Left join tmp_table b
    On unix_timestamp((concat_ws('-',a.year,a.month,a.day,a.hour)),"yyyy-MM-dd-HH") > 
    b.cdc_date
    

    【讨论】:

    • 在我的环境中 hive.mapred.mode 设置为严格,因此禁用了 cartesion 产品。我尝试使用左连接,但仍然收到相同的错误“出于安全原因禁用笛卡尔产品。
    • 它不是真正的笛卡尔连接 - 它只是左连接。可以改成普通加入看看吗?
    • 我也尝试过正常加入。它仍然说“出于安全原因禁用笛卡尔产品”。是不是因为我们正在尝试进行非 equi 连接?
    • 奇怪。像select a.id from a join b on a.id = b.id 这样的正常连接是否有效?
    • @KoushikRoy Hive 中的非 equi 连接被实现为 CROSS 连接 + 过滤器,这就是您的查询也不起作用的原因。因为在引擎盖下它是交叉连接。并在您的最后一条评论中查询:... from tableA , t1 as a where ... - 这也是同一个 CROSS 连接,因为没有 ON 的连接是一个交叉
    【解决方案2】:

    单行表交叉连接:

    Select count(*) 
     from tableA as a 
          cross join tmp_table b
    where unix_timestamp((concat_ws('-',a.year,a.month,a.day,a.hour)),"yyyy-MM-dd-HH") > b.cdc_date
    

    【讨论】:

    • 在我的环境中 hive.mapred.mode 设置为 strict,因此禁用了 cartesion 产品。
    • @KalpanaSrinivasababu 如果没有启用交叉连接,唯一的方法是在另一个会话中使用带有 cdc_date 的参数,这会产生不必要的复杂性。最好设置 hive.mapred.mode=nonstrict;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多