配置单元未使用分区在外部表中选择数据

时间:2019-01-24 12:40:02

标签: apache-spark hive hdinsight

我从未见过的怪异行为。

A在我的HDFS中有一个由Spark生成的实木复合地板文件,分为3个分区。

这是所有分区的计数。它是由火花计算的。

+----------+--------+
|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');

添加了所有分区。

显示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'; < / p>

取而代之的是预期的 12774895 个计数行,但我仍然获得全部计数。

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

现在,我尝试按 created_at 分区进行计数和分组。

0:jdbc:hive2:// headnodehost:10001 />从created.at的raw.event组中选择created_at,count(*);

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

我仍然可以获得全部的行数,以及最后添加的分区。

我很确定镶木地板文件包含不同的 created_at 值。

避免使用统计信息,这也无济于事。

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

分析表也无济于事:

0:jdbc:hive2:// headnodehost:10001 />分析表raw.event分区(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 />分析表raw.event分区(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]

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

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

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

此外,分区也不取决于数据本身,甚至也不取决于目录,位置和值,取决于您将其添加到表的方式