복붙노트

[HADOOP] 돼지에 JSON 배열로드하기

HADOOP

돼지에 JSON 배열로드하기

다음 형식의 json 파일이 있습니다.

[
  {
    "id": 2,
    "createdBy": 0,
    "status": 0,
    "utcTime": "Oct 14, 2014 4:49:47 PM",
    "placeName": "21/F, Cunningham Main Rd, Sampangi Rama NagarBengaluruKarnatakaIndia",
    "longitude": 77.5983817,
    "latitude": 12.9832418,
    "createdDate": "Sep 16, 2014 2:59:03 PM",
    "accuracy": 5,
    "loginType": 1,
    "mobileNo": "0000005567"
  },
  {
    "id": 4,
    "createdBy": 0,
    "status": 0,
    "utcTime": "Oct 14, 2014 4:52:48 PM",
    "placeName": "21/F, Cunningham Main Rd, Sampangi Rama NagarBengaluruKarnatakaIndia",
    "longitude": 77.5983817,
    "latitude": 12.9832418,
    "createdDate": "Oct 8, 2014 5:24:42 PM",
    "accuracy": 5,
    "loginType": 1,
    "mobileNo": "0000005566"
  }
]

JsonLoader 클래스를 사용하여 돼지에 데이터를로드하려고 할 때 예기치 않은 end-of-input과 같은 오류가 발생합니다 : OBJECT에 대한 예상 가까운 마커

a = LOAD '/user/root/jsoneg/exp.json' USING JsonLoader('id:int,createdBy:int,status:int,utcTime:chararray,placeName:chararray,longitude:double,latitude:double,createdDate:chararray,accuracy:double,loginType:double,mobileNo:chararray');
b = foreach a generate $0,$1,$2;
dump b;

해결법

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

    1.언젠가는 비슷한 종류의 문제에 직면하게됩니다. 나중에 Pig JSON이 다중 선 json 형식을 지원하지 않을 것임을 알게되었습니다. json 입력은 항상 한 줄로 입력해야합니다.

    언젠가는 비슷한 종류의 문제에 직면하게됩니다. 나중에 Pig JSON이 다중 선 json 형식을 지원하지 않을 것임을 알게되었습니다. json 입력은 항상 한 줄로 입력해야합니다.

    네이티브 Jsonloader 대신 Elephantbird json loader를 사용하는 것이 좋습니다. 그것은 꽤 Jsons 형식에 좋습니다.

    다음 링크에서 항아리를 다운로드 할 수 있습니다.

    http://www.java2s.com/Code/Jar/e/elephant.htm
    

    입력 형식을 한 줄로 변경하고 elephantbird를 통해 아래에로드했습니다.

    input.json
    {"test":[{"id": 2,"createdBy": 0,"status": 0,"utcTime": "Oct 14, 2014 4:49:47 PM","placeName": "21/F, Cunningham Main Rd, Sampangi Rama NagarBengaluruKarnatakaIndia","longitude": 77.5983817,"latitude": 12.9832418,"createdDate": "Sep 16, 2014 2:59:03 PM","accuracy": 5,"loginType": 1,"mobileNo": "0000005567"},{"id": 4,"createdBy": 0,"status": 0,"utcTime": "Oct 14, 2014 4:52:48 PM","placeName": "21/F, Cunningham Main Rd, Sampangi Rama NagarBengaluruKarnatakaIndia","longitude": 77.5983817,"latitude": 12.9832418,"createdDate": "Oct 8, 2014 5:24:42 PM","accuracy": 5,"loginType": 1,"mobileNo": "0000005566"}]}
    
    PigScript:
    REGISTER '/tmp/elephant-bird-hadoop-compat-4.1.jar';
    REGISTER '/tmp/elephant-bird-pig-4.1.jar';
    
    A = LOAD 'input.json ' USING com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad');
    B = FOREACH A GENERATE FLATTEN($0#'test');
    C = FOREACH B GENERATE FLATTEN($0) AS mymap;
    D = FOREACH C GENERATE mymap#'id',mymap#'placeName',mymap#'status';
    DUMP D;
    
    Output:
    (2,21/F, Cunningham Main Rd, Sampangi Rama NagarBengaluruKarnatakaIndia,0)
    (4,21/F, Cunningham Main Rd, Sampangi Rama NagarBengaluruKarnatakaIndia,0)
    
  2. from https://stackoverflow.com/questions/26710438/load-json-array-into-pig by cc-by-sa and MIT license