2010-09-13 10 views

Odpowiedz

13

Użyj GROUP_CONCAT aggregate function:

SELECT yt.userid, 
     GROUP_CONCAT(yt.col SEPARATOR ' ') AS combined 
    FROM YOUR_TABLE yt 
GROUP BY yt.userid 

Domyślnym separatorem jest przecinek (","), więc musisz określić SEPARATOR pojedynczego spacji, aby uzyskać wyjście, którego pragniesz.

Jeśli chcesz mieć pewność, kolejność wartości w GROUP_CONCAT, użyj:

SELECT yt.userid, 
     GROUP_CONCAT(yt.col ORDER BY yt.col SEPARATOR ' ') AS combined 
    FROM YOUR_TABLE yt 
GROUP BY yt.userid 
+0

jestem aktualnie używający Hive, więc nie mogę zrobić grupy po części, ponieważ GROUP_CONCAT nie jest rozpoznawany jako funkcja agregacji, w każdym razie wokół niego? – haoxu

+0

@haoxu: Następną opcją (z SQL prespective) będzie kursor i konkatenacja ciągów, ale wymagałoby to funkcji MySQL. Nie znam Hive - czy nie ma możliwości użycia natywnego zapytania? –

+1

Złożyłem wniosek JIRA dla GROUP_CONCAT w HiveQL: https://issues.apache.org/jira/browse/HIVE-1689 –

-6

jestem całkiem pewny, że nie można tego zrobić za pomocą Hive QL. Jednak powinno to być możliwe, jeśli napiszesz własną mapę/zredukuj skrypty - aby rozpocząć, zobacz this tutorial.

+0

odpowiedź jest nieaktualna. Nowsze wersje mają funkcje. –

41

W ulu można użyć

SELECT userid, collect_set(combined) FROM tabel GROUP BY user_id; 

collect_set usuwa zduplikowane. Jeśli trzeba je przechowywać można sprawdzić tego posta:

COLLECT_SET() in Hive, keep duplicates?

+1

dokładnie to, co chciałem! działa jak zaklęcie, aby połączyć wiersz z grupą za pomocą zapytania –

2
SELECT 
    userid, 
    concat_ws(" ", collect_set(col)) AS combined 
FROM table 
GROUP BY userid