hive没有使用分区来选择外部表中的数据

mkshixfv  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(334)

我从没见过这种奇怪的行为。
在我的hdfs中有一个由spark生成的Parquet文件,分为3个分区。
这是所有分区的计数。它是由spark计算的。

+----------+--------+
|created_at|count(1)|
+----------+--------+
|  20190101|12774895|
|  20181231|18648432|
|  20190102|30010065|
+----------+--------+

总计:61433392条记录
Hive
创建了一个表。

CREATE EXTERNAL TABLE raw.event (
    account_type STRING,
    event_name STRING,
    payload MAP<STRING, STRING>
)
PARTITIONED BY(created_at INT, product_name STRING, event_type STRING)
STORED AS PARQUET LOCATION '/datalake/raw/event'
TBLPROPERTIES('PARQUET.COMPRESS'='SNAPPY');

添加了所有分区。
显示分区raw.event;

+---------------------------------------------------------------------+--+
|                              partition                              |
+---------------------------------------------------------------------+--+
| created_at=20181231/product_name=A/event_type=X  |
| created_at=20190101/product_name=A/event_type=X  |
| created_at=20190102/product_name=A/event_type=X  |
+---------------------------------------------------------------------+--+

执行完全计数以确保一切顺利进行:
0: jdbc:hive2://headnodehost:10001/>从raw.event中选择count(*);

+-----------+--+
|    _c0    |
+-----------+--+
| 61433392  |
+-----------+--+

预期结果!好的:)
现在从一个分区开始计算。
0: jdbc:hive2://headnodehost:10001/>从raw.event中选择count(*),其中created_at=20190102,product_name='a'和event_type='x';
取而代之的是预期的12774895计数行,我仍然得到完整的计数。

+-----------+--+
|    _c0    |
+-----------+--+
| 61433392  |
+-----------+--+

现在我正在尝试按分区处创建的\u进行计数和分组。
0: jdbc:hive2://headnodehost:10001/>选择created_at,count(*)from raw.event group by created_at;

+-------------+-----------+--+
| created_at  |    _c1    |
+-------------+-----------+--+
| 20190102    | 61433392  |
+-------------+-----------+--+

我仍然得到完整的行数,并且只是最后添加的分区。
我很确定Parquet文件包含不同的创建值。
避免使用统计数据,也没有帮助。

set hive.compute.query.using.stats=false;

分析表也没有帮助:
0: jdbc:hive2://headnodehost:10001/>分析表raw.event分区(created\u at,product\u name,event\u type)计算统计信息;

INFO  : Partition raw.event{created_at=20181231, product_name=A, event_type=X} stats: [numFiles=111, numRows=**61433392**, totalSize=19637211108, rawDataSize=1965868544]
INFO  : Partition raw.event{created_at=20190101, product_name=A, event_type=X} stats: [numFiles=111, numRows=0, totalSize=19637211108, rawDataSize=0]
INFO  : Partition raw.event{created_at=20190102, product_name=A, event_type=X} stats: [numFiles=111, numRows=0, totalSize=19637211108, rawDataSize=0]

强制分区会产生相同的结果。
0: jdbc:hive2://headnodehost:10001/>analyze table raw.event partition(created\u at=20190102,product\u name,event\u type)计算统计信息;

INFO  : Partition raw.event{created_at=20190102, product_name=A, event_type=X} stats: [numFiles=111, numRows=**61433392**, totalSize=19637211108, rawDataSize=1965868544]

有什么建议吗?

a1o7rhls

a1o7rhls1#

这可能与您如何添加分区有关。看起来所有数据都在hdfs的同一目录下。分区指向hdfs中的一个特定位置(不是多个位置),因此我假设有一个分区指向整个数据集。您可以运行以下命令来验证分区位置

describe formatted raw.event  partition ( created_at=20181231,product_name="A",event_type="X");

另外,分区不依赖于数据本身,甚至目录、位置和值也不依赖于您如何将它们添加到表中

相关问题