sql - 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')
解决方案
如果您在 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从子查询/连接的结果中过滤分区
推荐阅读
- java - 使用java在POS热敏打印机中打印PDF或PNG
- java - 对java类中的整数数组进行排序,从2到18相当基本
- javascript - 使用 Node.js 需要与 ES6 导入/导出 (2018)
- flutter - 参数类型“RevealedOffset”不能分配给参数类型“num”
- java - Object 类型中的 toString() 方法不适用于参数(Collection
) - tensorflow - 无法使用 tensorflow 重新加载保存的 Keras 模型
- r - noUiSliderInput 输出只有 2 位小数的问题
- wpf - WPF:定义的内置样式在哪里
- c# - 元组列表到该元组列表中的第一个元素列表 C#
- javascript - 键盘导致模态消失 React-Native