복붙노트

[HADOOP] 기본 SerDE와 하이브 테이블 데이터로드

HADOOP

기본 SerDE와 하이브 테이블 데이터로드

데이터의 형식은 다음과

에이 비 씨 디이

P, Q, "E, R ', t

A, S, "t, g ', t

나는 하이브 테이블을 만들고 싶었

COL1, Col2의, 열 3, Col4

에이 비 씨 디이

P, Q, E, R, t

A, S, t, g, t

위에서 보듯이 데이터가 큰 따옴표로 캡슐화되어있는 경우, 그 사이에 쉼표가 테이블 데이터를 만드는 간주되어서는 안됩니다. 나는 기본 SerDe를 사용하는 경우 큰 따옴표는 무시되고, B는 C는 두 개의 컬럼으로 간주됩니다.

어떻게 따옴표로 캡슐화 된 경우 따옴표가 둘 사이의 요소의 쉼표를 무시하는 것을 보장 할

해결법

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

    1.그것이 가능하고 가능한 경우, 내가 먼저 당신이 입력 데이터가 필드 구분 기호 쉼표 이외의 것을 사용하는 등의 방법으로 살균 할 수있는 경우보고 탐구 권하고 싶습니다. 항상 자연스럽게 데이터에서 발생할 수있는 단락 문자 패턴을 사용하는 아슬 아슬하다.

    그것이 가능하고 가능한 경우, 내가 먼저 당신이 입력 데이터가 필드 구분 기호 쉼표 이외의 것을 사용하는 등의 방법으로 살균 할 수있는 경우보고 탐구 권하고 싶습니다. 항상 자연스럽게 데이터에서 발생할 수있는 단락 문자 패턴을 사용하는 아슬 아슬하다.

    이 방법을 사용할 수없는 경우에, 다음 인용 쉼표를 감지하는이 정규 표현식 기반 방법이 있습니다 :

    인위적인 구체적인 예를 들어, 당신의 데이터 (1 단계) 다음과 같은 단일 열 준비 테이블을로드 :

    hive> DESCRIBE staging;
    OK
    rawline                     string
    Time taken: 0.238 seconds, Fetched: 1 row(s)
    hive> SELECT * FROM staging;
    OK
    a,"b,c",d, e
    p,q,"e,r", t
    a,s,"t,g", t
    Time taken: 0.277 seconds, Fetched: 3 row(s)
    

    다음 쿼리는 최종 목표 테이블을 생성합니다.

    DROP TABLE IF EXISTS test;
    CREATE TABLE test (
        Col1 STRING,
        Col2 STRING,
        Col3 STRING,
        Col4 STRING
      );
    INSERT INTO TABLE test SELECT
      regexp_replace(fields[0], "\\[QUOTEDCOMMA\\]", ","),  -- Step #4
      regexp_replace(fields[1], "\\[QUOTEDCOMMA\\]", ","),  -- Step #4
      regexp_replace(fields[2], "\\[QUOTEDCOMMA\\]", ","),  -- Step #4
      regexp_replace(fields[3], "\\[QUOTEDCOMMA\\]", ",")   -- Step #4
    FROM (
      SELECT split(  -- Step #2 and #3
        regexp_replace(rawline, "\"([^,]*),([^,]*)\"", "$1[QUOTEDCOMMA]$2"),
        ',') AS fields
      FROM staging
    ) t;
    

    이것은 다음과 같은 최종 테이블 테스트를 생성합니다 :

    hive> SELECT * FROM test;
    OK
    a   b,c     d        e
    p   q       e,r      t
    a   s       t,g      t
    Time taken: 0.196 seconds, Fetched: 3 row(s)
    

    이 샘플 실시 예에서, 문자열은 [QUOTEDCOMMA] 따옴표 사이 발견 콤마 용 인공 틀로서 이용되고있다. 선택은 완전히 임의이며,이 경로를 이동하는 경우 실제로 당신은 당신의 자리가 자연스럽게 데이터 내에서 발생하지 않도록하는 것이 좋습니다.

  2. ==============================

    2.하이브의 기본 텍스트 serde (LazySimple는) 적절한 CSV 의미를 지원하지 않습니다. 0.14.0 - - 정확히 돌봐 새로운 serde있다 좋은 소식은 지금까지 하이브의 최신 버전이다. 이 버전을 사용하는 일이 있다면, 당신은 CSV의 serde를 사용하고 인용 문자로 큰 따옴표를 지정 - 데이터의 적절한 분석에 이르는, 당신은 귀하의 질문에 지정한다.

    하이브의 기본 텍스트 serde (LazySimple는) 적절한 CSV 의미를 지원하지 않습니다. 0.14.0 - - 정확히 돌봐 새로운 serde있다 좋은 소식은 지금까지 하이브의 최신 버전이다. 이 버전을 사용하는 일이 있다면, 당신은 CSV의 serde를 사용하고 인용 문자로 큰 따옴표를 지정 - 데이터의 적절한 분석에 이르는, 당신은 귀하의 질문에 지정한다.

    serde 및 사용 방법에 대한 정보 : https://cwiki.apache.org/confluence/display/Hive/CSV+Serde

  3. from https://stackoverflow.com/questions/28049674/hive-table-data-load-with-default-serde by cc-by-sa and MIT license