使用Hive 将父子结构转换成层级结构
已知表结构有parent_id
, id
, category_level
,category_name
其中,parent_id
代表的这个分类的上级分类,例如某一大类的二级分类的id等于下级三级的parent_id
其中id
是改分类的id
其中category_level
代表的是分类的等级,一级二级三级四级 ,最多四级.
其中category_name
代表分类的名称
想将其转化成
id1
,id2
,id3
,id4
,category_name_1
,category_name_2
,category_name_3
,category_name_4
SELECT COALESCE(t4.id,t3.id,t2.id,t1.id) AS final_id
,t1.id AS id_1
,t2.id AS id_2
,t3.id AS id_3
,t4.id AS id_4
,t1.category_name AS category_name_1
,t2.category_name AS category_name_2
,t3.category_name AS category_name_3
,t4.category_name AS category_name_4
FROM dw.dw_cate_table t1
LEFT JOIN dw.dw_cate_table t2
ON t1.id = t2.parent_id
LEFT JOIN dw.dw_cate_table t3
ON t2.id = t3.parent_id
LEFT JOIN dw.dw_cate_table t4
ON t3.id = t4.parent_id
WHERE t1.parent_id = 0
id | category_level | category_name | parent_id |
---|---|---|---|
1 | 1 | a | |
2 | 2 | b | 1 |
3 | 3 | c | 2 |
4 | 4 | d | 3 |
id1 | id2 | id3 | id4 | category_name1 | category_name2 | category_name3 | category_name4 |
---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | a | b | c | d |
当然以上的数据都是通过在没有一个指定的分类组进行的,加入有一个特定的分类组可以是这样使用
已知表结构有 cate_id
, parent_id
, id
, category_level
,category_name
其他的条件都一样,这里的cate_id
就是已经规定了一个特定分类组
那么就可以这么处理了,这里我就用三级分类来演示了
SELECT cate_id
,MAX(id_1) AS id_1
,MAX(id_2) AS id_2
,MAX(id_3) AS id_3
,MAX(category_name1) AS category_name_1
,MAX(category_name2) AS category_name_2
,MAX(category_name3) AS category_name_3
FROM
(
SELECT
,t1.id AS id_1
,t2.id AS id_2
,t3.id AS id_3
,t1.category_name AS category_name_1
,t2.category_name AS category_name_2
,t3.category_name AS category_name_3
,cate_id
FROM dw.dw_cate_table t1
LEFT JOIN dw.dw_cate_table t2
ON t1.id = t2.parent_id
LEFT JOIN dw.dw_cate_table t3
ON t2.id = t3.parent_id
WHERE t1.parent_id = 0
UNION
SELECT
,t1.id AS id_1
,t2.id AS id_2
,null AS id_3
,t1.category_name AS category_name_1
,t2.category_name AS category_name_2
,null AS category_name_3
,cate_id
FROM dw.dw_cate_table t1
LEFT JOIN dw.dw_cate_table t2
ON t1.id = t2.parent_id
WHERE t1.parent_id = 0
SELECT
,t1.id AS id_1
,null AS id_2
,null AS id_3
,t1.category_name AS category_name_1
,null AS category_name_2
,null AS category_name_3
,cate_id
FROM dw.dw_cate_table t1
WHERE t1.parent_id = 0
) t
group by cate_id