Как сжать несколько операторов where в Hiveql в диапазоне столбцов: где icd_proc_cd_1 = '43644' или ... или icd_proc_cd_28 = '43644' - PullRequest
1 голос
/ 26 февраля 2020

Есть ли более элегантный способ уплотнения оператора where в диапазоне переменных с индексированными именами?

Например, вместо:

create table table_cpt_43644
as select *
from master_table
where icd_proc_cd_1 = '43644' 
or icd_proc_cd_2 = '43644'
or icd_proc_cd_3 = '43644'
...
or icd_proc_cd_28 = '43644';

используйте что-то вроде следующего (что, увы, не работает):

create table table_cpt43644
as select *
from master_table
where icd_proc_cd_1-icd_proc_cd_28 = '43644';

1 Ответ

1 голос
/ 26 февраля 2020

Немного короче, используя array_contains:

where 
array_contains(
array( icd_proc_cd_1,icd_proc_cd_2,icd_proc_cd_3,icd_proc_cd_4,icd_proc_cd_5,icd_proc_cd_6,icd_proc_cd_7,icd_proc_cd_8,icd_proc_cd_9,icd_proc_cd_10,
       icd_proc_cd_11,icd_proc_cd_12,icd_proc_cd_13,icd_proc_cd_14, icd_proc_cd_15,icd_proc_cd_16,icd_proc_cd_17,icd_proc_cd_18,icd_proc_cd_19,icd_proc_cd_20, 
       icd_proc_cd_21,icd_proc_cd_22,icd_proc_cd_23,icd_proc_cd_24,icd_proc_cd_25,icd_proc_cd_26,icd_proc_cd_27,icd_proc_cd_28
     ), '43644')

Если ваша таблица основана на файле CSV, вы можете переопределить таблицу DDL, использовать regexSerDe и выбрать icd_proc_cd_1-icd_proc_cd_28 как один столбец, разделенный запятыми , тогда вы можете использовать еще более короткое решение, используя array_contains(split(column_concatenated, ','),'43644'). Использование rlike в этом случае также возможно. Хотя первое решение более гибкое.

...