Hive:读取 subselect 中定义的 table 个分区
Hive: read table partitions defined in subselect
我有一个按 partitionDate 字段分区的 Hive table。
我可以通过简单
读取我选择的分区
select * from myTable where partitionDate = '2000-01-01'
我的任务是动态指定我选择的分区。 IE。首先我想从一些 table 读取它,然后才 运行 select 到 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
创建 table
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')
如果你是 运行 Hive on Tez 执行引擎,试试
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
如果没有任何帮助,请参阅此解决方法:
或者这个:
类似问题:Hive Query is going for full table scan when filtering on the partitions from the results of subquery/joins
我有一个按 partitionDate 字段分区的 Hive table。 我可以通过简单
读取我选择的分区select * from myTable where partitionDate = '2000-01-01'
我的任务是动态指定我选择的分区。 IE。首先我想从一些 table 读取它,然后才 运行 select 到 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
创建 tableCREATE 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')
如果你是 运行 Hive on Tez 执行引擎,试试
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
如果没有任何帮助,请参阅此解决方法:
或者这个:
类似问题:Hive Query is going for full table scan when filtering on the partitions from the results of subquery/joins