Prenez N champs de la base de données, puis combinez-les et utilisez "," pour séparer l'affichage. Au début, j'ai pensé à utiliser CONCAT() pour le traiter, mais de manière inattendue, CONCAT_WS() a été mentionné dans le fichier. manuel très simple à utiliser.

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

Il s'agit d'une forme spéciale de CONCAT(). Le premier paramètre est le séparateur entre les paramètres restants. Le séparateur peut être la même chaîne que les paramètres restants. Si le séparateur est NULL, la valeur de retour sera également NULL et cette fonction le sera. jump. Toute chaîne NULL et vide après le paramètre délimiteur, le délimiteur sera ajouté entre les chaînes en cours de concaténée.

Un exemple simple est le suivant :

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'

Les fonctions liées à la collecte dans Hive incluent collect_list et collect_set.

Ils convertissent tous les deux une colonne du regroupement en tableau et la renvoient. La différence est que collect_list ne supprime pas les doublons mais collect_set le fait.

Faites une expérience simple pour approfondir votre compréhension et créez un tableau expérimental pour stocker les enregistrements des vidéos à la demande quotidiennes des utilisateurs :

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

Créez un fichier de données de test sur le système de fichiers local :

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

Chargez les données dans la table Hive :

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

Regroupez par utilisateur et récupérez les noms de toutes les vidéos regardées par chaque utilisateur chaque jour :

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

Cependant, il y a un problème avec les résultats de la requête ci-dessus. Parce que Farewell My Concubine est si bon, Li Si l'a regardé deux fois, cela conduit directement à des doublons dans la liste des vidéos regardées, donc la duplication doit être ajoutée et collect_set doit être utilisée. la différence avec collect_list est qu'il supprimera les doublons :

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

Adieu ma concubine n'apparaît qu'une seule fois dans les enregistrements de visionnage de Li Si, obtenant l'effet de déduplication.

Traverser le groupe par restrictions

Vous pouvez également utiliser collect pour contourner les restrictions de group by Dans Hive, lors d'une requête group by, il est obligatoire que les colonnes qui apparaissent après la sélection apparaissent après group by, c'est-à-dire que la colonne de sélection doit être la colonne utilisée comme colonne. la base du regroupement, mais certains Parfois, nous voulons regrouper selon A, puis retirer au hasard un B dans chaque groupe. Dans cette expérience, nous regroupons par utilisateur, puis sélectionnons au hasard le nom d'une vidéo qu'il a regardée :

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

video_name n'est pas une colonne de regroupement et les données de cette colonne peuvent toujours être récupérées.

Extraits résumés dans :

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

HTTPS://wuwuwu.cn blog sur.com/Cao Cao11001100/fear/9043946.HTML

Laisser une réponse