Lấy N trường từ cơ sở dữ liệu, sau đó kết hợp chúng lại với nhau và sử dụng "," để phân tách màn hình. Lúc đầu, tôi nghĩ đến việc sử dụng CONCAT() để xử lý nó, nhưng thật bất ngờ, CONCAT_WS() đã được đề cập trong phần này. hướng dẫn sử dụng, rất dễ sử dụng.

CONCAT_WS(separator, str1, str2,...)

Nó là một dạng đặc biệt của CONCAT(). Tham số đầu tiên là dấu phân cách giữa các tham số còn lại. Dấu phân cách có thể là chuỗi giống với các tham số còn lại. Nếu dấu phân cách là NULL thì giá trị trả về cũng sẽ là NULL và hàm này. sẽ nhảy Bất kỳ NULL nào và các chuỗi trống sau tham số dấu phân cách, dấu phân cách sẽ được thêm vào giữa các chuỗi được nối.

Một ví dụ đơn giản như sau:

mysql> SELECT CONCAT_WS(",","First name","Second name","Last Name");
       -> 'First name,Second name,Last Name'
mysql> SELECT CONCAT_WS(",","First name",NULL,"Last Name");
       -> 'First name,Last Name'

Các hàm liên quan đến thu thập trong Hive bao gồm coll_list và coll_set.

Cả hai đều chuyển đổi một cột trong nhóm thành một mảng và trả về nó. Sự khác biệt là coll_list không loại bỏ các bản sao nhưng coll_set thì có.

Thực hiện một thử nghiệm đơn giản để hiểu sâu hơn và tạo bảng thử nghiệm để lưu trữ bản ghi các video theo yêu cầu hàng ngày của người dùng:

create table t_visit_video (
    username string,
    video_name string
) partitioned by (day string)
row format delimited fields terminated by ',';

Tạo tệp dữ liệu thử nghiệm trên hệ thống tệp cục bộ:

张三,大唐双龙传
李四,天下无贼
张三,神探狄仁杰
李四,霸王别姬
李四,霸王别姬
王五,机器人总动员
王五,放牛班的春天
王五,盗梦空间

Tải dữ liệu vào bảng Hive:

load data local inpath '/root/hive/visit.data' into table t_visit_video partition (day='20180516');

Nhóm theo người dùng và truy xuất tên của tất cả các video được mỗi người dùng xem hàng ngày:

select username, collect_list(video_name) from t_visit_video group by username ;
张三  ["大唐双龙传","神探狄仁杰"]
李四  ["天下无贼","霸王别姬","霸王别姬"]
…………

Tuy nhiên, có một vấn đề với kết quả truy vấn trên vì Farewell My Concubine quá hay nên Li Si đã xem nó hai lần, điều này trực tiếp dẫn đến trùng lặp trong danh sách các video đã xem, vì vậy nên thêm bản sao và sử dụng coll_set. sự khác biệt giữa nó và coll_list là nó sẽ loại bỏ các bản sao:

select username, collect_set(video_name) from t_visit_video group by username;
张三  ["大唐双龙传","神探狄仁杰"]
李四  ["天下无贼","霸王别姬"]
…………

Bá Vương Phi Phi chỉ xuất hiện một lần trong hồ sơ xem của Lý Tư, đạt được hiệu quả loại bỏ trùng lặp.

Vượt qua nhóm bằng những hạn chế

Bạn cũng có thể sử dụng thu thập để vượt qua các hạn chế của nhóm theo. Trong Hive, khi truy vấn nhóm theo, yêu cầu các cột xuất hiện sau khi chọn phải xuất hiện sau nhóm theo, nghĩa là cột được chọn phải là cột được sử dụng làm cột cơ sở để phân nhóm, nhưng một số Đôi khi chúng tôi muốn nhóm theo A và sau đó chọn ngẫu nhiên một B trong mỗi nhóm Trong thử nghiệm này, chúng tôi nhóm theo người dùng và sau đó chọn ngẫu nhiên tên của một video mà anh ấy đã xem:

select username, collect_list(video_name)[0] from t_visit_video group by username;
张三  大唐双龙传
李四 天下无贼
…………

video_name không phải là cột nhóm và dữ liệu trong cột này vẫn có thể được truy xuất.

Trích đoạn được tóm tắt trong:

HTTPS://wuwuwu.cn blog trên.com/loco有/archive/2006/10/28/542751.HTML

HTTPS://wuwuwu.cn blog trên.com/Cao Cao11001100/fear/9043946.HTML

Để lại một câu trả lời