как объединить два столбца в один столбец, как карту в улье? - PullRequest
1 голос
/ 10 июля 2020

В улье у меня есть два столбца в таблице:

user_id    product_id    score
1          1, 2, 3       0.7, 0.2, 0.1
2          2, 3, 1       0.5, 0.25, 0.25

Тип product_id и оценка являются строками. Теперь я использую sh, чтобы сгенерировать новый столбец, который объединен с помощью product_id и набрал такую ​​оценку:

user_id    product_score
1          1:0.7, 2:0.2, 3:0.1
2          2:0.5, 3:0.25, 1:0.25

В новой таблице столбец product_score похож на карту, product_id - это ключ, а оценка - это значение, но на самом деле это все еще строка. Product_id и оценка связаны между собой ":". Различные идентификаторы product_ids связаны с помощью ',' и упорядочены по начальному порядку в product_id в исходной таблице. Как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Используйте split () для получения массивов, map () для преобразования в карту

select user_id, 
       map(product_id[0], score[0],
           product_id[1], score[1], 
           product_id[2], score[2]
       ) as product_score

(
select user_id, split(product_id,',') as product_id, split(score,',') as score
  from ...
)s;
0 голосов
/ 10 июля 2020

Решено - объединить два столбца массива, такие как карта ключей и значений, с порядком .

Подход - разбить массив с помощью метода Posexplode и получить одинаковое значение pos из нескольких столбцов

SQL Запрос -

with rowidcol as 
(
   select user_id, split(product_id, ',') prod_arr, split(score, ',') score_arr, row_number() over() as row_id 
   from prod 
),
coltorows as 
(
   select row_id, user_id, prod_arr[prd_index] product, score_arr[score_index] score, prd_index, score_index 
   from rowidcol 
      LATERAL view posexplode(prod_arr) ptable as prd_index, pdid 
      LATERAL view posexplode(score_arr) prtable as score_index, sid 
),
colselect as 
(
   select row_id, user_id, collect_list(concat(product, ':', score)) product_score 
   from coltorows 
   where prd_index = score_index 
   group by row_id, user_id 
)
select user_id, concat_ws(',', product_score) as prodcut_score 
from colselect 
order by user_id;

Вход - Имя таблицы - Продукт -

user_id  product_id    score     
1         A,B,C,D      10,20,30,40       
2         X,Y,Z        1,2,3         
3         K,F,G        100,200,300

Выход -

user_id   prodcut_score    
1         A:10,B:20,C:30,D:40     
2         X:1,Y:2,Z:3        
3         K:100,F:200,G:300  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...