【问题标题】:Must run "analyze table" in hive else count(*) shows 0必须在配置单元中运行“分析表”否则计数(*)显示 0
【发布时间】:2021-07-20 15:40:29
【问题描述】:

我正在 S3 上的 parquet 文件上创建一个外部 Hive 表。命令看起来像

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(*)...”,我得到了预期的行数。

这不是一个阻碍,但它让我觉得我正在做某事/没有做某事导致这种奇怪的行为。欢迎任何见解。

【问题讨论】:

标签: amazon-s3 hive parquet


【解决方案1】:

您没有告诉优化器表的统计信息,因此它显示为 0,因为它对其中的数据一无所知。
理想情况下,您应该在将数据加载到表/分区时收集统计信息。过时的统计信息或没有统计信息将使优化器继续思考/猜测,从而使查询运行时间更长/消耗更多内存,有时会返回错误的值。
现在,您可以在 hive 中设置此属性以收集自动统计信息 -

hive.stats.autogather=true

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

ANALYZE TABLE tab COMPUTE STATISTICS;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2012-02-08
    • 2020-05-27
    相关资源
    最近更新 更多