【问题标题】:“Hive” max column value from multiple columns来自多个列的“Hive”最大列值
【发布时间】:2019-02-11 20:24:15
【问题描述】:

嗨:我有一种情况,我需要找到 3 个计算字段的最大值并将其存储在另一个字段中,是否可以在一个 SQL 查询中完成?下面是例子

SELECT Income1 ,
       Income1 * 2%  as Personal_Income ,
       Income2 ,
       Income2 * 10% as Share_Income ,
       Income3 ,
       Income3 * 1%  as Job_Income , 
       Max(Personal_Income, Share_Income, Job_Income ) 
  From Table

我尝试的一种方法是在第一遍和第二遍中计算Personal_Income, Share_Income, Job_Income

Select 
      Case when Personal_income > Share_Income and Personal_Income > Job_Income 
                then Personal_income 
           when Share_income > Job_Income 
                then Share_income 
           Else Job_income as the greatest_income

但这需要我对十亿行表进行 2 次扫描,我怎样才能避免这种情况并一次性完成?非常感谢任何帮助。

【问题讨论】:

    标签: sql hadoop hive hiveql


    【解决方案1】:

    从 Hive 1.1.0 开始,您可以使用 greatest() 函数。此查询将在单个表扫描中执行:

    select Income1 ,
           Personal_Income ,
           Income2 ,
           Share_Income ,
           Income3 ,
           Job_Income ,
           greatest(Personal_Income, Share_Income, Job_Income ) as greatest_income
    from
    (
    SELECT Income1 ,
           Income1 * 2%  as Personal_Income ,
           Income2 ,
           Income2 * 10% as Share_Income ,
           Income3 ,
           Income3 * 1%  as Job_Income , 
      From Table
    )s
    ;
    

    【讨论】:

    • 谢谢!它可以工作,但它确实存在 NULL 值的问题,如果有 NULL 值,最大的总是选择 NULL。不知道有没有像 ZERO IF NULL 这样的函数。
    • @NK7983 确实有这个功能。 NVL(value,0)。有关完整功能的文档,请参见此处:cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
    • 是的。我找到了。谢谢!我的问题现在解决了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2022-12-24
    • 1970-01-01
    相关资源
    最近更新 更多