0

큰 데이터 처리에서 그룹 의 요약을 기존의 쿼리 구조 (그룹화, 하위 쿼리 등)를 변경하지 않고 "스케치"하는 것이 좋습니다. Spark SQL (및 HiveQL)에서 collect_set은이를 수행하는 UDAF의 예입니다. 그룹당 고유 한 값의 열을 만듭니다.키 별 값에 대한 스파크/하이브 UDAF

주어진 내가 예를 들어 열 B의 각각의 고유 값에 대한 열 A의 고유 값의지도를 빌드 UDAF을 찾고

,

date user_id category revenue 
1/1 1  a  1 
1/1 2  b  0 
1/1 3  a  0 
1/2 2  b  10 
1/2 3  a  0 
1/2 4  b  1 

쿼리

select date, collect_set_by_key(category, user_id) as distinct_user_ids_by_category 
from tbl 
group by date 
order by date 

해야 생성

date distinct_user_ids_by_category 
1/1 {a: [1, 3], b: [2]} 
1/2 {a: [3], b: [2, 4]} 

Collect to a Map in Hive 같은 결과가 필요하지만 필요하지 않습니다. 이 솔루션은 쿼리 구조를 변경하지 않고 단일 UDAF를 통해 이루어 지므로이 질문은 실질적으로 다릅니다.

내 배포 환경이 Spark 2.1이므로 하이브 UDAF 또는 기본 Spark UDAF가 동일하게 작동합니다. 나는 brickhouse, hivemall 및 Hive UDAFs가있는 몇 가지 다른 라이브러리를 점검했지만이 작업을 수행하지는 못했습니다.

+2

이 질문은 매우 유사합니다. http://stackoverflow.com/questions/24826530/collect-to-a-map-in-hive – Mariusz

+0

@Mariusz 그 질문은 솔루션이 UDAF이고 쿼리 구조가 변경되지 않았 음을 나타냅니다. – Sim

+0

그룹화를 변경하면 무엇을 의미합니까? 달성하려는 바를 정확히 설명해 주시겠습니까? –

답변

1

Sim, 나는이 같은 UDAF가 gather (https://github.com/jeromebanks/brickhouse/blob/master/src/main/java/brickhouse/udf/collect/GatherUDAF.java)이라는 벽돌집에 있지만 klout 버전에는 존재하지 않는다고 생각합니다. 나는 klout repo에 다시 합병하는 것에 대해별로 좋지 않았습니다. 여러 레코드를 볼 경우 목록에 중복이 포함될 수 있다고 생각합니다. 다른 질문에 대한 링크에서 언급 한 바와 같이

SELECT date, gather(category, user_id) 
FROM tbl 
GROUP BY date; 

또한, 다중를 수집하여 수행 할 수 있습니다,하지만 난 gather보다 효율적으로 할 수 있다고 생각하고, 사용하기 좀 더 쉽게.

+0

'gather '가 정확히 무엇을하는지 이해한다면, 결과 맵의 모든 값에 걸친 엔트리의 수는 (null이 아닌)'user_id' 행의 수와 같을 것입니다. 정확하니? – Sim

관련 문제