【问题标题】:Hive - ELSE in SUMHive - SUM 中的 ELSE
【发布时间】:2015-07-18 07:54:20
【问题描述】:

以下内容在 RDBMS 数据库上作为 SQL 运行良好。但是,这无法在 hive 上运行。

SELECT
        entry_date,
        customer,
        cust_loc,
        SUM(run_time) AS TOTAL_RUN,
        SUM(CASE WHEN run_time BETWEEN 10000 AND 20000 THEN entry_date ELSE 0 END) AS SLOT_1,
        SUM(CASE WHEN run_time BETWEEN 200001 AND 30000 THEN entry_date ELSE 0 END) AS SLOT_2,
        SUM(CASE WHEN run_time BETWEEN 31000 AND 40000 THEN entry_date ELSE 0 END) AS SLOT_3
FROM
        cust_run_details
WHERE
        app_env IN ('a','b')
        AND entry_date = '2015-02-01'
        AND flag_set='U'
GROUP BY
        customer,
        customer,
        cust_loc

我在 HIVE 上运行时遇到的错误是

FAILED: SemanticException [Error 10016]: Line 6:80 Argument type mismatch '0': The expression after ELSE should have the same type as those after THEN: "string" is expected but "int" is found

如何将其转换为 Hive 等效项?请任何想法在这里对我有帮助

【问题讨论】:

  • 将 SUM 更改为 COUNT 并去掉“ELSE 0”。花了很长时间才到那里。叹息..

标签: sql hadoop hive bigdata


【解决方案1】:

假设entry_datedate,您可能不想sum() 它。如果您想要不同范围内的运行时间总和,那么您需要这样的select

 SELECT entry_date,
        customer,
        cust_loc,
        SUM(run_time) AS TOTAL_RUN,
        SUM(CASE WHEN run_time BETWEEN 10000 AND 20000 THEN run_time ELSE 0 END) AS SLOT_1,
        SUM(CASE WHEN run_time BETWEEN 200001 AND 30000 THEN run_time ELSE 0 END) AS SLOT_2,
        SUM(CASE WHEN run_time BETWEEN 31000 AND 40000 THEN run_time ELSE 0 END) AS SLOT_3

如果您想要计算不同范围内的运行时间,那么:

 SELECT entry_date,
        customer,
        cust_loc,
        SUM(run_time) AS TOTAL_RUN,
        SUM(CASE WHEN run_time BETWEEN 10000 AND 20000 THEN 1 ELSE 0 END) AS SLOT_1,
        SUM(CASE WHEN run_time BETWEEN 200001 AND 30000 THEN 1 ELSE 0 END) AS SLOT_2,
        SUM(CASE WHEN run_time BETWEEN 31000 AND 40000 THEN 1 ELSE 0 END) AS SLOT_3

如果entry_date 可能是NULL,并且您想忽略这些记录,那么您可以在WHEN 条件中包含and entry_date is not null

【讨论】:

  • 谢谢戈登。感谢您的帮助。
【解决方案2】:

将 SUM 更改为 COUNT 并去掉“ELSE 0”。花了很长时间才到那里。叹息..

SELECT
        entry_date,
        customer,
        cust_loc,
        SUM(run_time) AS TOTAL_RUN,
        COUNT(CASE WHEN run_time BETWEEN 10000 AND 20000 THEN entry_date END) AS SLOT_1,
        COUNT(CASE WHEN run_time BETWEEN 200001 AND 30000 THEN entry_date END) AS SLOT_2,
        COUNT(CASE WHEN run_time BETWEEN 31000 AND 40000 THEN entry_date END) AS SLOT_3
FROM
        cust_run_details
WHERE
        app_env IN ('a','b')
        AND entry_date = '2015-02-01'
        AND flag_set='U'
GROUP BY
        customer,
        customer,
        cust_loc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多