Apache spark 配置单元未使用分区选择外部表中的数据
我从未见过这种奇怪的行为 A在Spark生成的HDF中有拼花文件,分为3个分区 这是所有分区的计数。它由火花计算Apache spark 配置单元未使用分区选择外部表中的数据,apache-spark,hive,azure-hdinsight,Apache Spark,Hive,Azure Hdinsight,我从未见过这种奇怪的行为 A在Spark生成的HDF中有拼花文件,分为3个分区 这是所有分区的计数。它由火花计算 +----------+--------+ |created_at|count(1)| +----------+--------+ | 20190101|12774895| | 20181231|18648432| | 20190102|30010065| +----------+--------+ 总数:61433392记录 蜂巢 创建了一个表。 CREATE EXTERN
+----------+--------+
|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');
执行完整计数以确保一切顺利进行:
0:jdbc:hive2://headnodehost:10001/>从raw.event中选择count(*)强>
+---------------------------------------------------------------------+--+
| 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 |
+---------------------------------------------------------------------+--+
+-----------+--+
| _c0 |
+-----------+--+
| 61433392 |
+-----------+--+
+-------------+-----------+--+
| created_at | _c1 |
+-------------+-----------+--+
| 20190102 | 61433392 |
+-------------+-----------+--+
INFO : Partition raw.event{created_at=20190102, product_name=A, event_type=X} stats: [numFiles=111, numRows=**61433392**, totalSize=19637211108, rawDataSize=1965868544]
预期结果!好的:)
现在只从一个分区计算
0:jdbc:hive2://headnodehost:10001/>从raw.event中选择count(*),其中创建了@u at=20190102和product_name='A'以及event_type='X'强>
+---------------------------------------------------------------------+--+
| 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 |
+---------------------------------------------------------------------+--+
+-----------+--+
| _c0 |
+-----------+--+
| 61433392 |
+-----------+--+
+-------------+-----------+--+
| created_at | _c1 |
+-------------+-----------+--+
| 20190102 | 61433392 |
+-------------+-----------+--+
INFO : Partition raw.event{created_at=20190102, product_name=A, event_type=X} stats: [numFiles=111, numRows=**61433392**, totalSize=19637211108, rawDataSize=1965868544]
取而代之的是获得预期的12774895计数行,我仍然得到完整的计数
+-----------+--+
| _c0 |
+-----------+--+
| 61433392 |
+-----------+--+
现在,我尝试按分区上创建的_进行计数和分组
0:jdbc:hive2://headnodehost:10001/>选择created_at,count(*)FROM raw.event group by created_at强>
+---------------------------------------------------------------------+--+
| 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 |
+---------------------------------------------------------------------+--+
+-----------+--+
| _c0 |
+-----------+--+
| 61433392 |
+-----------+--+
+-------------+-----------+--+
| created_at | _c1 |
+-------------+-----------+--+
| 20190102 | 61433392 |
+-------------+-----------+--+
INFO : Partition raw.event{created_at=20190102, product_name=A, event_type=X} stats: [numFiles=111, numRows=**61433392**, totalSize=19637211108, rawDataSize=1965868544]
我仍然得到完整的行数,以及最后添加的分区
我很确定拼花地板文件包含不同的创建值
避免使用统计数据,也没有帮助
set hive.compute.query.using.stats=false;
分析表也没有帮助:
0:jdbc:hive2://headnodehost:10001/>分析表raw.event分区(创建时间、产品名称、事件类型)计算统计信息
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分区(创建时间=20190102,产品名称,事件类型)计算统计信息强>
+---------------------------------------------------------------------+--+
| 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 |
+---------------------------------------------------------------------+--+
+-----------+--+
| _c0 |
+-----------+--+
| 61433392 |
+-----------+--+
+-------------+-----------+--+
| created_at | _c1 |
+-------------+-----------+--+
| 20190102 | 61433392 |
+-------------+-----------+--+
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");
此外,分区不依赖于数据本身,甚至目录、位置和值也不依赖于您将它们添加到表中的方式。这可能是统计数据的问题:给定命令中的
raw.event
和partition
之间应该有一个空格。最小编辑是6个字符,所以我不能自己编辑它。另外,我和OP在同一个团队中,运行该命令验证了分区位置在/raw/event/created\u at=20190101/product\u name=A/event\u type=X
@VishaalKalwani,那么分区的其余部分呢?位置是什么?是否有任何数据?对于所有3个分区(20191291、20190101、20190102),位置都遵循相同的模式。事实上,查询返回的结果与之前完全不同(使用*.stats=true
和*.stats=false
,但结果是相同和不同的)。配置设置是否有传播期?查询选择created_at,count(*)FROM raw.event group by created_at
现在返回:{20181231=>1262881758120190101=>117721617920190102=>2148549023}
。我修改了输出的格式,使其在这条评论中清晰可见。而且,它现在看起来与Databricks的结果相匹配,尽管与OP posted的数字不同。我将与OP讨论这些结果。很奇怪,它最初没有起作用。