我从未见过的奇怪行为。
我在Spark生成的HDFS中有拼花文件,分为3个分区。
这是所有分区的计数。它是由Spark计算的。
+----------+--------+
|created_at|count(1)|
+----------+--------+
| 20190101|12774895|
| 20181231|18648432|
| 20190102|30010065|
+----------+--------+
总计:61433392条记录
蜂巢
创建了一个表。
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');
添加了所有分区。
show partitions 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 |
+-----------+--+
现在我试图通过created_at分区进行计数和分组。
0:jdbc:hive2:// headnodehost:10001 /> SELECT created_at,count(*)FROM raw.event group by created_at;
+-------------+-----------+--+
| created_at | _c1 |
+-------------+-----------+--+
| 20190102 | 61433392 |
+-------------+-----------+--+
我仍然得到完整的行数,只是最后添加的分区。
我很确定镶木地板文件包含不同的created_at值。
避免使用统计数据,也没有帮助。
set hive.compute.query.using.stats=false;
分析表也没有帮助:
0:jdbc:hive2:// headnodehost:10001 /> ANALYZE TABLE raw.event PARTITION(created_at,product_name,event_type)COMPUTE STATISTICS;
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_at = 20190102,product_name,event_type)COMPUTE STATISTICS;
INFO : Partition raw.event{created_at=20190102, product_name=A, event_type=X} stats: [numFiles=111, numRows=**61433392**, totalSize=19637211108, rawDataSize=1965868544]
有什么建议吗?
这可能与您添加分区的方式有关。看起来您的所有数据都在HDFS的同一目录下。分区指向hdfs中的特定位置(不是多个位置),因此我假设1个分区指向整个数据集。您可以运行以下命令来验证分区位置
describe formatted raw.event partition ( created_at=20181231,product_name="A",event_type="X");
此外,分区不依赖于数据本身,甚至目录,位置和值取决于您将它们添加到表中的方式