【问题标题】:Hive: Is there a way to get the aggregates of all the numeric columns existing in a table?Hive:有没有办法获取表中存在的所有数字列的聚合?
【发布时间】:2019-09-19 09:36:45
【问题描述】:

我有一个包含超过 50 列(数字和字符)的表,有没有办法在不指定每一列的情况下获取整体统计信息?

举个例子:

a b c d 1 2 3 4 5 6 7 8 9 10 11 12

理想情况下,我会有类似的东西:

column_name min avg max sum a 1 5 9 15 b 2 6 10 18 c 3 7 11 21 d 4 8 12 24

尽管如此,一次获取一个聚合结果会更有帮助。

任何帮助/想法将不胜感激。

谢谢你,

【问题讨论】:

    标签: hive pivot hql transpose aggregates


    【解决方案1】:

    您可以使用 AWK 解析 DESCRIBE TABLE 输出并生成逗号分隔的 SUM(col) 字符串作为数字列的 sum_col 和所有其他列的 column_list。 在此示例中,它使用 goup by 生成 select 语句。在 shell 中运行:

    TABLE_NAME=your_schema.your_table
    
    NUMERIC_COLUMNS=$(hive -S -e "set hive.cli.print.header=false; describe ${TABLE_NAME};" | awk -F " " 'f&&!NF{exit}{f=1}f{ if($2=="int"||$2=="double") printf c "sum("toupper($1)") as sum_"$1}{c=","}')
    
    GROUP_BY_COLUMNS=$(hive -S -e "set hive.cli.print.header=false; describe ${TABLE_NAME};" | awk -F " " 'f&&!NF{exit}{f=1}f{if($2!="int"&&$2!="double") printf c toupper($1)}{c=","}')
    
    SELECT_STATEMENT="select $NUMERIC_COLUMNS $GROUP_BY_COLUMNS from $TABLE_NAME group by $GROUP_BY_COLUMNS"
    

    我只检查 int 和 double 列。您添加更多类型。您也可以优化它并只执行一次 DESCRIBE,然后使用相同的 AWK 脚本解析结果。希望你明白了。

    【讨论】:

    • 感谢您的回答。尽管如此,group by 语句还是有些问题,因为我需要总和。在这种情况下,我的最终表格将只包含 2 列,变量的名称总和。似乎上述建议对 char 变量进行了“分组”。
    • @OanaB 是的。如果您不需要,请删除该部分并构建适合您需要的 SELECT_STATEMENT。我为你提供了想法,当然我不会完全完成你的任务。无论如何你需要修改。只需删除 NUMERIC_COLUMNS
    • 是的,我试过了,但由于某种原因它无法识别我的表,它说cannot recognize input near 'from' 'my_schema' '.' in select clause :(如果我使用你的代码,它运行得很好。PS:我确实删除了from 语句之前的 $GROUP_BY_COLUMNS 位。
    • @OanaB 它可以与旧版本的 Hive 一起使用。较旧的 Hive 不适用于描述中的 schema.table。它需要:使用 my_schema;描述表(没有模式)。所以尝试再添加一个 SCHEMA 变量并将其从表中删除。并添加使用 $SCHEMA。您可以打印传递给 hive 的命令而不是执行它并尝试手动运行并修复。在你的 Hive 上调试它。它在我的环境中运行良好
    • 我仍在努力理解 AWK 的工作原理,但我已经做到了。当前使用您发布的脚本,它无法识别数字列: sum(c1): not found [No such file or directory]。我将数据类型更改为int,但它仍然无法正常工作。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    相关资源
    最近更新 更多