Как перебирать столбцы в одной строке в таблице HIVE

У меня есть требование, как показано ниже:

  1. У меня есть таблица HIVE, содержащая следующие поля:

    Таблица: USER_PRODUCT

    user_id, product1_id, product2_id, product3_id, ..., product10_id

Здесь фактический элемент для каждого user_id может быть любым от 1 до 10 (это означает, что для некоторых user_id присутствует ТОЛЬКО product1_id, product2_id)

  1. Я хочу обработать выше и удалить элементы, которые недействительны на основе другой таблицы, содержащей сведения о продукте:

    Таблица: PRODUCT_DEAILS

    product_id, product_status

  2. Я хочу добиться этого, написав запрос HIVE.

Может ли кто-нибудь помочь мне в написании запроса? Меня беспокоит, как перебрать все product_id для каждого user_id?

Для (все_строки в USER_PRODUCT) Перебрать все product_ID от 1 до 10) Проверьте, действителен ли продукт, основываясь на статусе продукта в PRODUCT_DEAILS. if (valid) --> оставить как есть else --> Удалить продукт из таблицы, установив для него значение null

Сколько всего строк содержит PRODUCT_DEAILS?

leftjoin 19.05.2019 07:55

PRODUCT_DETAILS может содержать от 100 000 до 150 000 строк.

rupesh 23.05.2019 02:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
814
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если 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;

Другие вопросы по теме