У меня есть требование, как показано ниже:
У меня есть таблица HIVE, содержащая следующие поля:
Таблица: USER_PRODUCT
user_id, product1_id, product2_id, product3_id, ..., product10_id
Здесь фактический элемент для каждого user_id может быть любым от 1 до 10 (это означает, что для некоторых user_id присутствует ТОЛЬКО product1_id, product2_id)
Я хочу обработать выше и удалить элементы, которые недействительны на основе другой таблицы, содержащей сведения о продукте:
Таблица: PRODUCT_DEAILS
product_id, product_status
Я хочу добиться этого, написав запрос HIVE.
Может ли кто-нибудь помочь мне в написании запроса? Меня беспокоит, как перебрать все product_id для каждого user_id?
Для (все_строки в USER_PRODUCT) Перебрать все product_ID от 1 до 10) Проверьте, действителен ли продукт, основываясь на статусе продукта в PRODUCT_DEAILS. if (valid) --> оставить как есть else --> Удалить продукт из таблицы, установив для него значение null
PRODUCT_DETAILS может содержать от 100 000 до 150 000 строк.
Если product_deals достаточно мал, создайте массив допустимых продуктов, выполните перекрестное соединение с USER_PRODUCT и используйте array_contains, чтобы проверить, является ли продукт действительным:
set hive.auto.convert.join=true;
set hive.auto.convert.join.noconditionaltask=true;
set hive.mapjoin.smalltable.filesize=1000000000; --adjust to small table size
set hive.auto.convert.join.noconditionaltask=1000000000;
with valid_product as (
select collect_set(product_id) as list
from PRODUCT_DEAILS
where product_status='valid'
sort by product_id
)
insert overwrite table USER_PRODUCT
select p.user_id,
case when array_contains(v.list, p.product1_id) then p.product1_id end product1_id,
case when array_contains(v.list, p.product2_id) then p.product2_id end product2_id,
case when array_contains(v.list, p.product3_id) then p.product3_id end product3_id,
case when array_contains(v.list, p.product4_id) then p.product4_id end product4_id,
case when array_contains(v.list, p.product5_id) then p.product5_id end product5_id,
case when array_contains(v.list, p.product6_id) then p.product6_id end product6_id,
case when array_contains(v.list, p.product7_id) then p.product7_id end product7_id,
case when array_contains(v.list, p.product8_id) then p.product8_id end product8_id,
case when array_contains(v.list, p.product9_id) then p.product9_id end product9_id,
case when array_contains(v.list, p.product10_id) then p.product10_id end product10_id
from USER_PRODUCT p
cross join valid_product v; --cross join with single row containing array
Если PRODUCT_DEALS слишком велик для размещения в массиве, используйте обычные соединения:
set hive.auto.convert.join=true;
set hive.auto.convert.join.noconditionaltask=true;
set hive.mapjoin.smalltable.filesize=1000000000; --adjust to small table size
set hive.auto.convert.join.noconditionaltask=1000000000;
with valid_product as (
select distinct product_id --Get distinct IDs of valid products
from PRODUCT_DEAILS
where product_status='valid'
)
insert overwrite table USER_PRODUCT
select p.user_id,
case when v1.product_id is not null then p.product1_id end product1_id,
case when v2.product_id is not null then p.product2_id end product2_id,
case when v3.product_id is not null then p.product3_id end product3_id,
case when v4.product_id is not null then p.product4_id end product4_id,
case when v5.product_id is not null then p.product5_id end product5_id,
case when v6.product_id is not null then p.product6_id end product6_id,
case when v7.product_id is not null then p.product7_id end product7_id,
case when v8.product_id is not null then p.product8_id end product8_id,
case when v9.product_id is not null then p.product9_id end product9_id,
case when v10.product_id is not null then p.product10_id end product10_id
from USER_PRODUCT p
left join valid_product v1 on p.product1_id=v1.product_id
left join valid_product v2 on p.product2_id=v2.product_id
left join valid_product v3 on p.product3_id=v3.product_id
left join valid_product v4 on p.product4_id=v4.product_id
left join valid_product v5 on p.product5_id=v5.product_id
left join valid_product v6 on p.product6_id=v6.product_id
left join valid_product v7 on p.product7_id=v7.product_id
left join valid_product v8 on p.product8_id=v8.product_id
left join valid_product v9 on p.product9_id=v9.product_id
left join valid_product v10 on p.product10_id=v10.product_id;
Сколько всего строк содержит PRODUCT_DEAILS?