복붙노트

[HADOOP] 구조체 배열로 데이터 선택 하이브

HADOOP

구조체 배열로 데이터 선택 하이브

나는 Hive에서 플랫 소스로부터 데이터를 선택하고 구조체의 배열로 출력하는 방법을 찾아 내려하고있다. 다음은 내가 찾고있는 것의 예입니다 ...

샘플 데이터 :

house_id,first_name,last_name
1,bob,jones
1,jenny,jones
2,sally,johnson
3,john,smith
3,barb,smith

원하는 출력 :

1   [{"first_name":"bob","last_name":"jones"},{"first_name":"jenny","last_name":"jones"}]
2   [{"first_name":"sally","last_name":"johnson"}]
3   [{"first_name":"john","last_name":"smith"},{"first_name":"barb","last_name":"smith"}]

collect_list 및 collect_set을 시도했지만 기본 데이터 유형만 허용합니다. 하이브에서 내가 어떻게 할 수 있을지에 대한 생각?

해결법

  1. ==============================

    1.이 항아리를 사용할 것이고, collect (그리고 복잡한 데이터 유형을 취하는)를 훨씬 더 잘 구현할 수 있습니다.

    이 항아리를 사용할 것이고, collect (그리고 복잡한 데이터 유형을 취하는)를 훨씬 더 잘 구현할 수 있습니다.

    질문:

    add jar /path/to/jar/brickhouse-0.7.1.jar;
    create temporary function collect as 'brickhouse.udf.collect.CollectUDAF';
    
    select house_id
      , collect(named_struct("first_name", first_name, "last_name", last_name))
    from db.table
    group by house_id
    

    산출:

    1   [{"first_name":"bob","last_name":"jones"}, {"first_name":"jenny","last_name":"jones"}]
    2   [{"first_name":"sally","last_name":"johnson"}]
    3   [{"first_name":"john","last_name":"smith"},{"first_name":"barb","last_name":"smith"}]
    
  2. ==============================

    2.대안을 사용할 수도 있습니다.

    대안을 사용할 수도 있습니다.

    select collect_list(full_name) full_name_list from (
        select 
            concat_ws(',', 
                concat("first_name:",first_name), 
                concat("last_name:",last_name)
                ) full_name, 
            house_id
        from house) a 
    group by house_id
    
  3. from https://stackoverflow.com/questions/32385425/hive-select-data-into-an-array-of-structs by cc-by-sa and MIT license