Улей: условно обрезать и загрузить таблицу - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь решить проблему, когда все категории исходной таблицы доступны в target, а затем обрезают и загружают целевую таблицу, иначе ничего не делают.

Я не нашел никакого решения, просто используя куст и в конечном итоге использовал сценарий оболочки , чтобы решить эту проблему.

возможно ли избежать сценария оболочки?

Текущий подход:

create_ind_table.hql :

create temporary table temp.master_source_join
as select case when source.program_type_cd=master.program_type_cd then 1 else 0 end as IND
from source left join master
    on source.program_type_cd=master.program_type_cd;

--if all the categoies from source persent in master then will contain 1 else 0'
drop table if exists temp.indicator;
create table temp.indicator
as select min(ind)*max(ind) as ind from master_source_join;

Ниже приведен скрипт, который я вызываю для Truncate и загрузки основной таблицы, если все основные исходные таблицы присутствуют в master.

tuncate_load_master.sh

beeline_cmd="beeline -u 'jdbc:hive2://abc.com:2181,abc1.com:2181,abc2.com:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2' --showHeader=flase --silent=true"
${beeline_cmd} -f create_ind_table.hql
## if indicator is 1 all the source category is present in master else not.

a=`${beeline_cmd} -e "select ind from temp.indicator;"`
temp=`echo $a | sed -e 's/-//g' | sed -e 's/+//g' | sed -e 's/|//g'`
echo $temp
if [ ${temp} -eq 1 ]
then
    echo "truncate and load the traget table"
    ${beeline_cmd} -e "insert overwrite table temp.master select * from temp.source;"
else
    echo "nothing to load"
fi

1 Ответ

0 голосов
/ 30 мая 2018

Запрос с динамическим разбиением перезапишет только те разделы, которые существуют в исходном наборе данных.Добавьте фиктивный раздел к своей таблице, как показано в этом ответе: https://stackoverflow.com/a/47505850/2700344

Вы можете рассчитать свой флаг, используя аналитический min() в том же подзапросе, и отфильтровать его.

Рассчитанный IND будет одинаковым для всех возвращаемых строк.И кажется, что аналитического min () достаточно, нет необходимости вычислять max ().Фильтр по IND = 1.Он не вернет никаких строк, если min() over() = 0, и не будет перезаписывать таблицу.

--enable dynamic partitioning
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

insert overwrite table temp.master PARTITION(dummy_part) 
select s.col1, s.col2, --list all columns here you need to insert 
        'dummy_value' as dummy_part --dummy partition column 
from 
(
select s.*, 
      min(case when s.program_type_cd=m.program_type_cd then 1 else 0 end ) over() as IND
from source s left join master m
    on s.program_type_cd=m.program_type_cd
)s where ind=1 --filter will not return rows if min=0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...