2014-01-18 28 views
19

是否存在Hive查询以快速查找表大小(即行数)而不启动耗时的MapReduce作业? (这就是为什么我想避免COUNT(*)。)Hive查询快速查找表大小(行数)

我试过DESCRIBE EXTENDED,但是产生了numRows=0这显然是不正确的。

(很抱歉没能福利局问题,我试着用搜索引擎和搜索没有成功apache.org文档)。

+0

检查此[链接](https://stackoverflow.com/a/45304801/704381​​5)!希望它有助于:) –

回答

22

tblproperties将给出表的大小,如果需要的话可以用来抓取该值。

-- gives all properties 
show tblproperties yourTableName 

-- show just the raw data size 
show tblproperties yourTableName("rawDataSize") 
+1

显然,只有当这些属性对列可用时,给定的命令才起作用,默认情况下这些属性不存在。 –

+0

@Jared,单元是什么?字节? – Steven

+0

是的输出是字节。此外,这仅适用于已经在其上运行统计信息的非分区表。 – Jared

-5

它是一个很好的问题。计数()将花费很多时间来查找结果。但不幸的是()是唯一的办法。

还存在另一种方式(不能说比上面的情况下备用但更好等待时间):

设置属性 组hive.exec.mode.local.auto = TRUE;

并运行相同的命令(从tbl中选择count(*)),这会提供比以前更好的延迟。

+0

确实有其他方法。见下面的其他答案。 –

20

这里是快速命令

ANALYZE TABLE tablename [PARTITION(partcol1[=val1], partcol2[=val2], ...)] COMPUTE STATISTICS [noscan]; 

例如,如果表已分区

hive> ANALYZE TABLE ops_bc_log PARTITION(day) COMPUTE STATISTICS noscan; 

输出是

分区logdata.ops_bc_log {天= 20140523}统计:[numFiles = 37,numRows = 26095186,totalSize = 654249957,rawDataSize = 58080809507]

Part银行足球比赛logdata.ops_bc_log {天= 20140521}统计:[numFiles = 30,= numRows行21363807,总计TOTALSIZE = 564014889,rawDataSize = 47556570705]

分区logdata.ops_bc_log {天= 20140524}统计:[numFiles = 35,= numRows行25210367,总计TOTALSIZE = 631424507,rawDataSize = 56083164109]

分区logdata.ops_bc_log {天= 20140522}统计:[numFiles = 37,= numRows行26295075,总计TOTALSIZE = 657113440,rawDataSize = 58496087068]

所用时间:5.252秒

+0

请注意,根据[文档](https://cwiki.apache.org/confluence/display/Hive/StatsDev),“noscan”参数将阻止扫描文件以获取正确的行数。你会得到总大小。在你的情况下,它可能已经工作,因为你正在通过配置收集统计信息。 –

+0

@DanielLangdon是rawDataSize字节,块或其他的单位吗? – dlamblin

-1

使用实木复合地板格式来存储外部/内部表格的数据。那么你会得到更快的结果。

2

有关使用方法:

hdfs dfs -du -s -h /path/to/table/name