2017-11-13 8 views
0

하이브의 STRUCTS 배열로 선택하는 데 문제가 있습니다.하이브 스트럭처의 배열을 만드는 SELECT 문

내 소스 테이블은 다음과 같습니다

+-------------+--+ 
| field | 
+-------------+--+ 
| id   | 
| fieldid  | 
| fieldlabel | 
| fieldtype | 
| answer_id | 
| unitname | 
+-------------+--+ 

이 ID가 조사 아이디, 중간에 네 개의 필드는 응답 데이터, 그리고 unitname이 사업 단위는 설문 조사 데이터입니다 조사는에 속한다.

각 설문 ID에 대한 모든 답변에 대해 구조체 배열을 만들어야합니다. 나는이 일 것이라고 생각하지만, 그렇지 않은 :

select id, 
array( 
    named_struct(
     "field_id", 
     fieldid, 
     "field_label", 
     fieldlabel, 
     "field_type", 
     fieldtype, 
     "answer_id", 
     answer_id,)) as answers, 
unitname 
from new_answers; 

무슨 반환하면 해당 답변에 대한 하나의 구조체의 배열로 각각 조사 응답 (FIELD_ID)는 다음과 같이이다 :

id | answers | unitname 
1 | [{"field_id":175877,"field_label":"Comment","field_type":"COMMENT","answer_id":8990947803}] | Location1 
2 | [{"field_id":47824,"field_label":"Language","field_type":"MULTIPLE_CHOICE","answer_id":8990950069}] | Location2 
2 | [{"field_id":48187,"field_label":"Language Type","field_type":"MULTIPLE_CHOICE","answer_id":8990950070}] | Location2 
2 | [{"field_id":47829,"field_label":"Trans #","field_type":"TEXT","answer_id":8990950071}] | Location2 

그러나() 쿼리 내가 검색하고 검색 한

id | answers | unitname  
1 | [{"field_id":175877,"field_label":"Comment","field_type":"COMMENT","answer_id":8990947803}] | Location1 
2 | [{"field_id":47824,"field_label":"Language","field_type":"MULTIPLE_CHOICE","answer_id":8990950069}, 
    {"field_id":48187,"field_label":"Language Type","field_type":"MULTIPLE_CHOICE","answer_id":8990950070}, 
    {"field_id":47829,"field_label":"Trans #","field_type":"TEXT","answer_id":8990950071}] | Location2 

하지만, 내가 찾는거야 모든 해답은 INSERT INTO .... 값을 사용하여 할 것 같다 : 제가에 도착해야 할 것은 이것이다. 나는 이미 테이블 구조를 가지고있다. ARRAY를 ARRAY로 가져올 수 없습니다.

모든 도움을 주시면 감사하겠습니다.

재생 목적

, 필요가있을 경우 : 당신이 찾고있는 것 같다

CREATE TABLE `new_answers`( 
`id` bigint, 
`fieldid` bigint, 
`fieldlabel` string, 
`fieldtype` string, 
`answer_id` bigint, 
`unitname` string) 

INSERT INTO new_answers VALUES 
(1,175877,"Comment","COMMENT",8990947803,"Location1"), 
(2,47824,"Language","MULTIPLE_CHOICE",8990950069,"Location2"), 
(2,48187,"Language Type","MULTIPLE_CHOICE",8990950070,"Location2"), 
(2,47829,"Trans #","TEXT",8990950071,"Location2"); 

답변

0

하는 기능이 배열에 구조체를 수집하는 것입니다. Hive에는 collect_set 및 collect_list와 같이 배열로 항목을 수집하는 두 가지 기능이 있습니다. 그러나 이러한 함수는 기본 유형의 배열 만 만들 수 있습니다.

brickhouse 프로젝트 용 병 (https://github.com/klout/brickhouse/wiki/Downloads)은 복잡한 유형을 수집하는 기능을 포함하여 많은 기능을 제공합니다.

add jar hdfs://path/to/your/jars/brickhouse-0.6.0.jar 

그런 다음 당신은 당신이 원하는대로 이름을 사용하여 collect 기능을 추가 할 수 있습니다

create temporary function collect_struct as 'brickhouse.udf.collect.CollectUDAF'; 

다음 쿼리 :

id answers unitname 
1 [{"field_id":175877,"field_label":"Comment","field_type":"COMMENT","answer_id":8990947803}] Location1 
2 [{"field_id":47824,"field_label":"Language","field_type":"MULTIPLE_CHOICE","answer_id":8990950069},{"field_id":48187,"field_label":"Language Type","field_type":"MULTIPLE_CHOICE","answer_id":8990950070},{"field_id":47829,"field_label":"Trans #","field_type":"TEXT","answer_id":8990950071}] Location2 
+0

감사 :

select id , collect_struct( named_struct( "field_id", fieldid, "field_label", fieldlabel, "field_type", fieldtype, "answer_id", answer_id)) as answers , unitname from new_answers group by id, unitname ; 

는 다음과 같은 결과를 제공합니다 , @ 게이브. 그렇게하면 대답을 받아 들일 것입니다. 그 환경에서의 보안은 문제였습니다. 그래서 저는 벽돌집을 넣을 수 있을지 확신하지 못했습니다. 다른 한편으로는, 나는 질문을 할 때 내가 일했던 회사에서 더 이상 일하지 않기 때문에, 실용적인 답변을 얻는 것이 오늘 나에게 충분하다. –