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)的主要内容,如果未能解决你的问题,请参考以下文章