Hive 如何迭代配置单元表中同一行中的列

Hive 如何迭代配置单元表中同一行中的列,hive,hiveql,Hive,Hiveql,我有如下要求: 我有一个蜂巢表,其中包含以下字段: 表:用户和产品 用户id、产品1 id、产品2 id、产品3 id等,产品10_id 这里,每个用户\u id的实际项可以是1到10之间的任何值(对于某些用户\u id来说,只有product1\u id,product2\u id存在) 我想处理上述内容,并根据另一个包含产品详细信息的表删除无效的项目: 表:产品数据 产品标识、产品状态 我想通过编写一个配置单元查询来实现这一点 有人能帮我写这个问题吗?我关心的是如何迭代每个用户的所有产品标识

我有如下要求:

  • 我有一个蜂巢表,其中包含以下字段:

    表:用户和产品

    用户id、产品1 id、产品2 id、产品3 id等,产品10_id

  • 这里,每个用户\u id的实际项可以是1到10之间的任何值(对于某些用户\u id来说,只有product1\u id,product2\u id存在)

  • 我想处理上述内容,并根据另一个包含产品详细信息的表删除无效的项目:

    表:产品数据

    产品标识、产品状态

  • 我想通过编写一个配置单元查询来实现这一点

  • 有人能帮我写这个问题吗?我关心的是如何迭代每个用户的所有产品标识

    For(用户产品中的所有行) 迭代所有产品(从1到10) 根据产品目录中的产品状态检查产品是否有效 如果(有效)-->保持原样
    否则-->通过将产品设置为null将其从表中删除。如果产品交易足够小,则构建有效产品的数组,与用户产品交叉连接,并使用数组包含检查产品是否有效:

    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;
    

    产品数据总共包含多少行?产品详细信息的行数可能在100000到150000之间