2017-09-21 4 views
0

나는 회의에 사람의 출석에 대한 다음 JSON 개체가 : 내가 S3아마존 아테나 - 중첩 된 JSON은 문제

에 저장된 데이터가 어디를 가리키는 테이블을 만들려면 다음 코드를 실행 한

{"conferences_attended": [ 
      {"conference_name": "dreamforce", 
      "date": "2017", 
      "city": "san francisco", 
      "state": "ca"}, 
      {"conference_name": "RampUp", 
      "date": "2016", 
      "city": "san francisco", 
      "state": "ca"}, 
      ], 
    "last_name" : "doe"} 

CREATE EXTERNAL TABLE IF NOT EXISTS my_db.attendees (
     `last_name` string, 
     `conferences_attended` array< struct< 
      conference_name:string, 
      date:string, 
      city:string, 
      state:string, 
     >>, 
    ) 
    ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
    WITH SERDEPROPERTIES (
     'serialization.format' = '1' 
    ) LOCATION 's3://**' 
    TBLPROPERTIES ('has_encrypted_data'='false'); 

이제 제 질문에 2 부분이 있습니다.

1) 중첩 된 json 개체에있는 데이터에 액세스하려면 어떻게 쿼리합니까? 아래의 두 쿼리는 작동하지 않으며 비슷한 쿼리도 없습니다.

SELECT conferences_attended 
    FROM attendees; 

    SELECT conferences_attended.conference_name 
    FROM attendees; 

2) 중첩 된 json의 특정 부분에만 일치하는 결과를 얻으려면 어떻게 쿼리합니까?

SELECT * 
    FROM attendees 
    WHERE conferences_attended.conference_name like '%force%'; 

나는 데이터 유형 또는 취소 둥지를 변경하려면 데이터 또는 뭔가 similr ... 도움을 주셔서 감사합니다 그리고 이러한 유형의 작업을 지원하는 정보에 대한 링크를 필요로 믿고 날 리드 그 오류를 얻고있다. 다음 링크를 읽고 도움이되었지만 여전히 나의 필요를 해결하지 못함을 유의하십시오. http://docs.aws.amazon.com/athena/latest/ug/rows-and-structs.htmlhttp://thornydev.blogspot.com/2013/07/querying-json-records-via-hive.html 및 많은 다른 사람 ...

마지막으로, 'org.apache.hive.hcatalog.data.JsonSerDe'와 'org.openx.data.jsonserde.JsonSerDe'의 차이점에 대한 조언이나 리소스를 환영합니다 .

답변

0

먼저 외부 테이블의 필드가 사용자가 가리 키려고하는 json 파일의 필드와 일치하지 않습니다.

보인다로서 다음과 같이 테이블 정의해야한다 : 다른 필드에 액세스하려고하는 동안 당신은 conferences_attended의 필드와 COMPANY_NAME 및 linkedin_company_id을 언급 한

CREATE EXTERNAL TABLE IF NOT EXISTS my_db.attendees (
    `last_name` string, 
    `conferences_attended` array<struct<conference_name:string, 
    date:string, city:string, state:string>>, 
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
WITH SERDEPROPERTIES (
    'serialization.format' = '1' 
) LOCATION 's3://**' 
TBLPROPERTIES ('has_encrypted_data'='false'); 

.

이 후에는 다음과 같은 방법으로 필드를 액세스 할 수 있습니다 : conferences_attended이 구조체의 배열이기 때문에

SELECT conferences_attended 
FROM attendees; 

그러나, 당신은 배열의 특정 구조의 필드에 액세스하는 배열 인덱스를 언급 할 필요가 . 당신이 데이터에 대한 몇 가지 필터를 배열에있는 모든 구조를 분석하고 적용 할 경우이 UNNEST을 사용하여 수행 할 수 있습니다, 지금

SELECT conferences_attended[1].conference_name FROM attendees; 

: 그래서이 대신 :

SELECT conferences_attended.conference_name 
FROM attendees; 

는 다음과 같이 시도 다음과 같은 방식으로 기능 :

SELECT 
last_name, 
conferences.conference_name, 
conferences.date, 
conferences.city, 
conferences.state 
FROM 
attendees CROSS JOIN UNNEST(conferences_attended) as t(conferences) 
WHERE 
conferences.conference_name like '%force%'; 

당신은 더 참조에 대한 다음 링크를 참조 할 수 있습니다 : http://docs.aws.amazon.com/athena/latest/ug/flattening-arrays.html