2014-07-10 4 views
2

대용량 JSON 구조를 하이브에로드하기 위해 스키마를 만들려고합니다. 그러나 일부 필드는 이름에 밑줄을 긋기 때문에 문제가 있습니다. 루트 수준에서는 괜찮습니다. 그러나 중첩 된 필드에 대해이 작업을 수행하는 방법을 찾지 못했습니다. -합니다 ("somefield"의 값 위의 샘플에로드 한 후, 그러나이 스키마 확인을 구축중첩 된 필드에 밑줄이있는 하이브에서 JSON 매핑

create table testSample 
( 
    id string, 
    something struct 
    < 
     somefield:int, 
     anotherfield:bigint, 
     yetanotherfield:int 
    > 
) 
row format serde 'org.openx.data.jsonserde.JsonSerDe' 
with serdeproperties 
(
    "mapping.id"  = "_id", 
    "mapping.somefield" = "_somefield" 
); 

다음과 같이 스키마를 사용

{ 
    "_id" : "319FFE15FF908EDD86B7FDEADBEEFBD8D7284128841B14AA6A966923C268DF39", 
    "SomeThing" : 
    { 
      "_SomeField"  : 22, 
      "AnotherField" : 2112, 
      "YetAnotherField": 1 
    } 
. . . etc . . . . 

:

샘플 JSON 중첩 + 선행 밑줄)은 항상 null입니다 (다른 모든 값은 존재하고 정확합니다).

우리는 많은 구문 조합을 시도했지만 아무 소용이 없습니다.

트릭은 이름에 앞에 밑줄이있는 중첩 된 필드를 hap하는 것을 알고 있습니까?

건배!

답변

2

내 자신의 질문에 대답 : 당신이 할 수 없기 때문에 트릭이 없습니다.

그러나 쉽게 해결할 수 있습니다. 스키마를 만들 때 이름을 리터럴로 처리하도록 Hive에 지시 할 수 있습니다. 이 작업을 수행하는 경우 동일한 리터럴 구문을 사용하여 쿼리해야합니다. 위의 예에서는 다음과 같이 표시됩니다.

`_something` struct<rest_of_definitions> 

특수한 serde 속성이 없어도됩니다. 그런 다음 쿼리에 다시 사용

select stuff.`_something` from sometable; 

예를, 스키마 : 입력 JSON에 대한

create table testSample 
( 
    id string, 
    something struct 
    < 
     `_somefield`:int, 
     anotherfield:bigint, 
     yetanotherfield:int 
    > 
) 
row format serde 'org.openx.data.jsonserde.JsonSerDe' 
with serdeproperties("mapping.id" = "_id"); 

같은 :

{ 
    "_id": "someuid", 
    "something": 
    { 
     "_somefield": 1, 
     "anotherfield": 2, 
     "yetanotherfield": 3 
    } 
} 

같은 쿼리 :

select something.`_somefield` 
from testSample 
where something.anotherfield = 2;