Hive: читать разделы таблицы, определенные в подзапросе

У меня есть таблица Hive, которая разделена полем partitionDate. Я могу прочитать выбранный мной раздел с помощью простого

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

person MiamiBeach    schedule 21.07.2021    source источник
comment
не могли бы вы запустить analyze table tab compute statistics; и проверить? Он должен следовать за разделом. Если только тип данных partitionDate не равен timestamp/date, а тип данных вашей другой таблицы - string. Можете ли вы также запустить explain elect * from myTable mt join thatTable tt on tt.reportDate = mt.partitionDate и проверить, попадает ли он в раздел?   -  person Koushik Roy    schedule 21.07.2021
comment
@KoushikRoy, я выполнил статистику вычислений таблицы myTable (partitionDate), но это не дало никакого эффекта. Я дважды проверил, совпадают ли типы столбцов = String. Я запустил объяснение и не вижу никаких доказательств того, что раздел, используемый для запроса, выберите * из myTable, где partitionDate in (выберите reportDate из thatTable)   -  person MiamiBeach    schedule 21.07.2021
comment
cab вы выложите create table из mytable. хотел посмотреть, правильно ли это разделено.   -  person Koushik Roy    schedule 21.07.2021
comment
@KoushikRoy, обновил пост. Но посмотрите, простой запрос select * from myTable, где partitionDate = '2000-01-01' работает хорошо, поэтому похоже, что проблема не в разделении, а в том, как я указываю раздел.   -  person MiamiBeach    schedule 21.07.2021
comment
или можно собрать статистику ...   -  person Koushik Roy    schedule 21.07.2021


Ответы (1)


Если вы используете Hive на механизме выполнения 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 

Если ничего не помогает, см. Этот обходной путь: https://stackoverflow.com/a/56963448/2700344

Или этот: https://stackoverflow.com/a/53279839/2700344

Аналогичный вопрос: Hive Query выполняет полное сканирование таблицы при фильтрации разделов по результатам подзапроса / объединений

person leftjoin    schedule 21.07.2021
comment
Я использую MR, а не TEZ. Кроме того, как я могу записать результаты моего запроса в переменную? Насколько я понимаю, это невозможно, по крайней мере, в простом Hive QL. - person MiamiBeach; 21.07.2021
comment
@MiamiBeach Единственно возможный способ подобен предоставленным ссылкам обходного пути. Не в том же сценарии. - person leftjoin; 21.07.2021