首页 > 解决方案 > Hive:读取子选择中定义的表分区

问题描述

我有一个按 partitionDate 字段分区的 Hive 表。我可以通过简单的方式读取我选择的分区

select * from myTable where partitionDate = '2000-01-01'

我的任务是动态指定我选择的分区。即首先我想从某个表中读取它,然后才运行select to myTable。当然,我希望使用分区的力量。

我写了一个看起来像的查询

select * from myTable mt join thatTable tt on tt.reportDate = mt.partitionDate

该查询有效,但看起来没有使用分区。查询工作时间过长。

我尝试了另一种方法:

select * from myTable where partitionDate in (select reportDate from thatTable)

..我再次看到查询工作太慢了。

有没有办法在 Hive 中实现这一点?

更新:为 myTable 创建表

CREATE TABLE `myTable`(            
  `theDate` string,            
 ')            
PARTITIONED BY (           
  `partitionDate` string) 
TBLPROPERTIES (             
  'DO_NOT_UPDATE_STATS'='true',         
  'STATS_GENERATED_VIA_STATS_TASK'='true',                
  'spark.sql.create.version'='2.2 or prior',              
  'spark.sql.sources.schema.numPartCols'='1',    
  'spark.sql.sources.schema.numParts'='2',          
  'spark.sql.sources.schema.part.0'='{"type":"struct","fields":[{"name":"theDate","type":"string","nullable":true}...         
  'spark.sql.sources.schema.part.1'='{"name":"partitionDate","type":"string","nullable":true}...',               
  'spark.sql.sources.schema.partCol.0'='partitionDate')  

标签: sqlhivequery-optimizationpartitionhive-partitions

解决方案


如果您在 Tez 执行引擎上运行 Hive,请尝试

set hive.tez.dynamic.partition.pruning=true;

在 Jira HIVE-7826中阅读更多详细信息和相关配置

同时尝试重写为 LEFT SEMI JOIN:

select * 
  from myTable t 
       left semi join (select distinct reportDate from thatTable) s on t.partitionDate = s.reportDate 

如果没有任何帮助,请参阅此解决方法:https ://stackoverflow.com/a/56963448/2700344

或者这个:https ://stackoverflow.com/a/53279839/2700344

类似的问题:Hive Query is going for full table scan when从子查询/连接的结果中过滤分区


推荐阅读