【问题标题】:Get row count from all tables in hive从 hive 中的所有表中获取行数
【发布时间】:2014-02-20 07:21:51
【问题描述】:

如何使用 hive 从所有表中获取行数?我对数据库名、表名和行数感兴趣

【问题讨论】:

  • 检查这个link希望它有帮助!!

标签: hql hive


【解决方案1】:

你需要做一个

select count(*) from table

适用于所有表格。

要自动执行此操作,您可以制作一个小型 bash 脚本和一些 bash 命令。 第一次运行

$hive -e 'show tables' | tee tables.txt

这会将数据库中的所有表存储在文本文件tables.txt中

创建一个包含以下内容的 bash 文件 (count_tables.sh)。

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

这将创建一个文本文件(counts.txt),其中包含数据库中所有表的计数

【讨论】:

  • 当我在INSERT INTO TABLE table SELECT row FROM another_table 之后运行它时,我只得到添加的行数,而不是表中的总行数,你怎么才能总是得到总行数?跨度>
  • @Mukul 输出为 +-----Table-----+.... 以 | 开头和结尾的行.有什么方法可以只获取表名?
【解决方案2】:

获取表中所有行的近似计数的更快方法是对表运行解释。在其中一个解释子句中,它显示如下所示的行数:

TableScan [TS_0] (rows=224910 width=78)

好处是您实际上并没有花费集群资源来获取该信息。


HQL 命令为 explain select * from table_name;,但未优化时不显示行在 TableScan 中。

【讨论】:

  • 什么是“在桌子上运行解释”是explain table db.table;?因为那是无效的。
【解决方案3】:

select count(*) from table

我认为没有更有效的方法了。

【讨论】:

  • 如何为数据库中的所有表自动执行此操作。我实际上对类似于 information_schema.tables 的功能感兴趣,例如 hive 中的功能,它将使用 HQL 在数据库中的所有表中登记记录计数。任何想法
  • 德比中的任何此类功能。 Metastore 默认的数据库名称是什么?
  • Derby 或 MySQL 只存储表的元信息,即模式。在 hive 中,表的模式只是定义了一种在 hdfs 中处理数据的方法。当您在 hive 中加载数据时,hive 只需将文件放入 hdfs 并更新 metastore 中的 hdfs 位置。 Metastore 中没有计数器。
  • 这有帮助。谢谢你。当需要这样的审计功能来了解跨数据库的所有表中加载了多少行时,可以做什么。我不想发出几个 count * 并希望将其保留为最后一个选项。
  • 当我在INSERT INTO TABLE table SELECT row FROM another_table 之后运行它时,我只得到添加的行数,而不是表中的总行数,你怎么才能总是得到总行数?跨度>
【解决方案4】:

您可以使用 Hive ANALAYZE 命令收集有关表的统计信息。基于 Hive 成本的优化器利用这些统计数据来创建最佳执行计划。

以下是计算 Hive 表统计信息的示例:

hive> ANALYZE TABLE stud COMPUTE STATISTICS;
 Query ID = impadmin_20171115185549_a73662c3-5332-42c9-bb42-d8ccf21b7221
 Total jobs = 1
 Launching Job 1 out of 1
 …
 Table training_db.stud stats: [numFiles=5, numRows=5, totalSize=50, rawDataSize=45]
 OK
 Time taken: 8.202 seconds

链接: http://dwgeek.com/apache-hive-explain-command-example.html/

【讨论】:

    【解决方案5】:

    尝试让这些人自动化——在运行 bash filename.sh 之后放入 shell

    hive -e 'select count(distinct fieldid) from table1 where extracttimestamp sample.out

    hive -e 'select count(distinct fieldid) from table2 where day='26'' > sample.out

    lc=cat sample.out | uniq | wc -l 如果 [ $lc -eq 1 ];然后 回声“通过” 别的 回声“失败” 菲

    【讨论】:

      【解决方案6】:

      下面sn-p中如何提及需要引用的具体数据库:

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

      【讨论】:

      • 顺便说一句,我认为这是一个以反问问题开始的答案。如果您要问这个问题,请将其改为单独的问题。
      【解决方案7】:

      这是我写的一个使用 python 的解决方案:

      import os
      dictTabCnt={}
      
      print("=====Finding Tables=====")
      tableList = os.popen("hive --outputformat=dsv --showHeader=false -e \"use [YOUR DB HERE]; show tables;\"").read().split('\n')
      
      print("=====Finding Table Counts=====")
      for i in tableList:
          if i <> '':
              strTemp = os.popen("hive --outputformat=dsv --showHeader=false -e \"use [YOUR DB HERE]; SELECT COUNT(*) FROM {}\"".format(i)).read()
              dictTabCnt[i] = strTemp
      
      print("=====Table Counts=====")
      for table,cnt in dictTabCnt.items():
          print("{}: {}".format(table,cnt))
      

      【讨论】:

      • 依赖于select count(*) from table
      【解决方案8】:

      您也可以在同一命令中设置数据库,并用;分隔。

      hive -e 'use myDatabase;show tables'
      

      【讨论】:

        猜你喜欢
        • 2021-12-31
        • 2019-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-02
        • 1970-01-01
        • 2012-12-25
        • 1970-01-01
        相关资源
        最近更新 更多