蜂巢中必须 运行 "analyze table" 否则 count(*) 显示 0

Must run "analyze table" in hive else count(*) shows 0

我正在 S3 上的镶木地板文件上创建外部 Hive table。命令看起来像

CREATE EXTERNAL TABLE userinfo(
  user_id string,
  last_name string,
  first_name string
)
PARTITIONED BY (
  yr string,
  mo string)
ROW FORMAT SERDE
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  's3://mybucket/basedir/'
TBLPROPERTIES (
  'serialization.null.format'='');

alter table userinfo add IF NOT EXISTS partition (yr='2021', mo='07');

此时,如果我 运行 “select count(*) from userinfo”,我得到 0 作为结果。但是如果我然后 运行

ANALYZE TABLE userinfo PARTITION(yr='2021', mo='07') COMPUTE STATISTICS;

然后重新运行“select count(*)...”我得到了预期的行数。

这不是一个表演障碍,但它让我觉得我正在做 something/failing 做一些导致这种奇怪行为的事情。欢迎任何见解。

您没有告诉优化器 table 的统计信息,因此它显示 0,因为它对其中的数据一无所知。
理想情况下,只要将数据加载到 table/partition,就应该收集统计信息。过时的统计数据或没有统计数据将保留优化器 thinking/guessing,从而使查询 运行 longer/consume 更多内存,有时 return 错误值。
现在,您可以在配置单元中设置此 属性 以进行自动统计收集 -

hive.stats.autogather=true

或者您可以在加载数据后立即手动收集它们。

ANALYZE TABLE tab COMPUTE STATISTICS;