【问题标题】:COALESCE with Hive SQL与 Hive SQL 合并
【发布时间】:2012-11-07 19:47:50
【问题描述】:

由于 Hive 不支持 IFNULLISNULLNVL 函数,我无法将 NULL 转换为 0。我尝试了 COALESCE(*column name*, 0),但收到以下错误消息:

参数类型不匹配 0:COALESCE 之后的表达式应该都是 具有相同的类型:预期为“bigint”,但找到了“int”

如何解决?

【问题讨论】:

标签: sql hive


【解决方案1】:

Hive 支持bigint literal since 0.8 version。所以,额外的“L”就足够了:

COALESCE(column, 0L)

【讨论】:

    【解决方案2】:

    正如 Lamak 在评论中指出的那样,COALESCE(column, CAST(0 AS BIGINT)) 解决了错误。

    【讨论】:

      【解决方案3】:

      由于0.11 hive具有NVL功能 nvl(T value, T default_value)

      如果值为空则返回默认值,否则返回值

      【讨论】:

        【解决方案4】:

        来自 [Hive 语言手册][1]:

        合并 (T v1, T v2, ...)

        将返回第一个不为 NULL 的值,如果所有值都为 NULL,则返回 NULL

        https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-ConditionalFunctions

        【讨论】:

          【解决方案5】:

          如果客户的主要联系媒介是电子邮件,如果电子邮件为空则为电话号码,如果电话号码也为空则为地址。它将使用 COALESCE 编写为

          coalesce(email,phonenumber,address) 
          

          而在 hive 中也可以通过将 nvl 链接在一起来实现

          nvl(email,nvl(phonenumber,nvl(address,'n/a')))
          

          【讨论】:

            【解决方案6】:

            来自Language DDL & UDF of Hive

            NVL(value, default value) 
            

            如果值为null,则返回默认值,否则返回值

            【讨论】:

              【解决方案7】:
              nvl(value,defaultvalue) as Columnname
              

              将缺失值设置为指定的默认值

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-12-13
                • 1970-01-01
                • 1970-01-01
                • 2018-12-28
                • 2021-09-01
                相关资源
                最近更新 更多