【问题标题】:Hive insert with multiple select带多项选择的 Hive 插入
【发布时间】:2015-12-02 03:12:33
【问题描述】:

我想在 hive 中执行类似的操作:

insert into mytable values (select count(*) from test2), (select count(*) from test3));

有没有办法做到这一点?

【问题讨论】:

    标签: hive hiveql


    【解决方案1】:

    为什么需要创建一个以行数为列的配置单元表?假设您必须每天记录行数,我不确定我们是否可以在 hive 中执行此操作。

    但是,如果您想对所有表的行数进行快照,您可以尝试运行类似这样的 shell 脚本...

    $hive -e 'use schema_name; show tables' | tee tables.txt
    

    这会将数据库中的所有表存储在文本文件 tables.txt 中 现在,编写一个 shell 脚本来获取所有收集到的表的计数

    while read line
    do
    echo "$line "
    eval "hive -e 'select count(*) from $line'"
    done
    

    更改现在生成的文件的文件权限

    $chmod +x count_tables.sh
    $./count_tables.sh < tables.txt > counts.txt
    

    如果您正在寻找定期记录行数,您可以将行数存储在 csv 中,方法是将值写入逗号分隔值并创建指向文件的外部表。

    类似

    $./count_tables.sh < tables.txt | sed 's/\t/,/g' > counts.txt
    

    希望这是实现这一目标的最佳方式

    【讨论】:

    • 您的解决方案是一个不错的解决方案,但是我需要创建 Hive 表来存储其他一些表的计数(或查询结果的计数)。我确实创建了一些 linux cron 脚本,这些脚本每 X 次执行一次并存储计数。我将解决方案写成单独的帖子。
    【解决方案2】:

    我找到了答案。应该是这样的:

    INSERT INTO TABLE mytable 
        SELECT c1,c2 FROM
          (SELECT count(*) FROM test2) AS c1
        JOIN
          (SELECT count(*) FROM test3) AS c2;
    

    【讨论】:

    • 我已经探索过这个选项,但我真的怀疑这是否可行。如果这真的有效,我会很高兴 :) 您能否确认实际查询,如果成功请确认?
    • 我根据自己的需要形成了一个稍微复杂的查询,类似于以下内容:INSERT INTO TABLE mytablehourlystatistics SELECT from_unixtime(unix_timestamp()),x,y,z FROM (SELECT count(*) AS x FROM my_table) AS c1 JOIN (SELECT count(*) AS y FROM my_table where col1 like '%xx%') AS c2 JOIN (SELECT count(*) AS z FROM my_table where col1 like '%yy%') AS c3;,它似乎可以很好地插入记录。我也有点惊讶,但正如他们所说,如果它有效,就不要碰它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    相关资源
    最近更新 更多