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

dzhpxtsq  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(312)

我有如下要求:
我有一个包含以下字段的配置单元表:
表:用户产品
用户标识,产品1标识,产品2标识,产品3标识,产品10\u id
这里,每个用户id的实际项可以是1到10之间的任何值(这意味着对于某些用户id,只有product1\u id,product2\u id存在)
我想处理以上内容,并根据另一个包含产品详细信息的表删除无效项:
表:产品目录
产品标识,产品状态
我想通过编写一个配置单元查询来实现这一点。
有人能帮我写这个问题吗?我关心的是如何迭代每个用户id的所有产品id?
for(用户产品中的所有行)遍历从1到10的所有产品标识)检查产品是否有效基于产品产品中的产品状态如果(有效)-->保持原样-->通过将产品设置为null从表中删除产品

ejk8hzay

ejk8hzay1#

如果产品\u deals足够小,请构建有效产品数组,与用户\u product交叉联接,并使用数组\u contains检查产品是否有效:

  1. set hive.auto.convert.join=true;
  2. set hive.auto.convert.join.noconditionaltask=true;
  3. set hive.mapjoin.smalltable.filesize=1000000000; --adjust to small table size
  4. set hive.auto.convert.join.noconditionaltask=1000000000;
  5. with valid_product as (
  6. select collect_set(product_id) as list
  7. from PRODUCT_DEAILS
  8. where product_status='valid'
  9. sort by product_id
  10. )
  11. insert overwrite table USER_PRODUCT
  12. select p.user_id,
  13. case when array_contains(v.list, p.product1_id) then p.product1_id end product1_id,
  14. case when array_contains(v.list, p.product2_id) then p.product2_id end product2_id,
  15. case when array_contains(v.list, p.product3_id) then p.product3_id end product3_id,
  16. case when array_contains(v.list, p.product4_id) then p.product4_id end product4_id,
  17. case when array_contains(v.list, p.product5_id) then p.product5_id end product5_id,
  18. case when array_contains(v.list, p.product6_id) then p.product6_id end product6_id,
  19. case when array_contains(v.list, p.product7_id) then p.product7_id end product7_id,
  20. case when array_contains(v.list, p.product8_id) then p.product8_id end product8_id,
  21. case when array_contains(v.list, p.product9_id) then p.product9_id end product9_id,
  22. case when array_contains(v.list, p.product10_id) then p.product10_id end product10_id
  23. from USER_PRODUCT p
  24. cross join valid_product v; --cross join with single row containing array

如果产品太大,无法放入数组中,则使用公共联接:

  1. set hive.auto.convert.join=true;
  2. set hive.auto.convert.join.noconditionaltask=true;
  3. set hive.mapjoin.smalltable.filesize=1000000000; --adjust to small table size
  4. set hive.auto.convert.join.noconditionaltask=1000000000;
  5. with valid_product as (
  6. select distinct product_id --Get distinct IDs of valid products
  7. from PRODUCT_DEAILS
  8. where product_status='valid'
  9. )
  10. insert overwrite table USER_PRODUCT
  11. select p.user_id,
  12. case when v1.product_id is not null then p.product1_id end product1_id,
  13. case when v2.product_id is not null then p.product2_id end product2_id,
  14. case when v3.product_id is not null then p.product3_id end product3_id,
  15. case when v4.product_id is not null then p.product4_id end product4_id,
  16. case when v5.product_id is not null then p.product5_id end product5_id,
  17. case when v6.product_id is not null then p.product6_id end product6_id,
  18. case when v7.product_id is not null then p.product7_id end product7_id,
  19. case when v8.product_id is not null then p.product8_id end product8_id,
  20. case when v9.product_id is not null then p.product9_id end product9_id,
  21. case when v10.product_id is not null then p.product10_id end product10_id
  22. from USER_PRODUCT p
  23. left join valid_product v1 on p.product1_id=v1.product_id
  24. left join valid_product v2 on p.product2_id=v2.product_id
  25. left join valid_product v3 on p.product3_id=v3.product_id
  26. left join valid_product v4 on p.product4_id=v4.product_id
  27. left join valid_product v5 on p.product5_id=v5.product_id
  28. left join valid_product v6 on p.product6_id=v6.product_id
  29. left join valid_product v7 on p.product7_id=v7.product_id
  30. left join valid_product v8 on p.product8_id=v8.product_id
  31. left join valid_product v9 on p.product9_id=v9.product_id
  32. left join valid_product v10 on p.product10_id=v10.product_id;
展开查看全部

相关问题