Select * 的行计数结果 MISMATCH 和大文件的 Hive 外部表的 Select count(1)

Posted

技术标签:

【中文标题】Select * 的行计数结果 MISMATCH 和大文件的 Hive 外部表的 Select count(1)【英文标题】:Row count results MISMATCH for Select * and Select count(1) for Hive External table for Big Files 【发布时间】:2020-09-10 10:19:05 【问题描述】:

我正在运行 hive 外部表查询。 问题: 'Select * from table1' 蜂巢显示的行数不同'Select count(*) from table1'。它应该匹配但不匹配不知道为什么?结果匹配 20 MB 左右的小数据,但不匹配大表,即 600 MB,它们不匹配。任何人都遇到过这个问题??

以下是我运行的一些查询以显示结果。我的源文件是 RDS 文件,我将其转换为 csv 文件并将其上传到 HDFS 并创建外部表。

更多细节

注意: 我只面对大文件的这个问题,例如大小 200 MB 或更大,但对于小文件,例如 80 MB,没有问题。

SELECT count(*) FROM dbname1.cy_tablet where Ranid Is NULL # Zero results

【问题讨论】:

select * from ...时怎么知道行数? @GMB 在 Hive 命令行界面中运行查询时显示。它显示了获取它们的行数和时间。我在屏幕截图中包含了相同的内容 可能这些数字只是估计值,因此当有很多行时结果会有所不同。 select count(*) 为您提供真实的计数。 看到这个答案:***.com/a/39914232/2700344 我会检查您的 .csv 末尾是否有多余的空行。这可以解释为什么行数(count(*) 返回的行数与您尝试将行数转换为实际字段时的行数不匹配(select ranid...)。 【参考方案1】:

我们解决了这个问题,现在所有计数都匹配了。 我们使用 col_names = FALSE 删除了用作 Hive 外部表源的 csv 文件中的标头

write_delim(df_data,delim = "|",col_names = FALSE, output_file)#

从 CREATE EXTERNAL TABLE 命令中删除以下行

TBLPROPERTIES('skip.header.line.count'='1'

以上步骤解决了我们的问题。

问题发生在大文件中。在我们的站点中,HDFS 块大小为 128MB,如果我们将文件大小除以 128MB 给我们一个数字,我得到的结果与差异相同。所以我认为问题出在标题上。

注意:我们使用管道“|”作为分隔符,我们在使用 ',' 时遇到了一些其他问题

【讨论】:

以上是关于Select * 的行计数结果 MISMATCH 和大文件的 Hive 外部表的 Select count(1)的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery 返回重复的行以及错误的计数

将 B 列的行与已合并的行 A 的计数合并

查询用于创建分组、聚合和过滤的行集的不同计数

计算子查询中的行数

jdbc利用java反射实现结果集得到处理:bug:argument type mismatch

mySQL 返回错误的计数结果