복붙노트

[HADOOP] 사용자 지정 구분 기호로 하이브에 데이터로드

HADOOP

사용자 지정 구분 기호로 하이브에 데이터로드

내 증분 로그 데이터를 저장할 수있는 내부 (관리되는) 테이블을 하이브에 만들려고합니다. 테이블은 이렇게됩니다 :

CREATE TABLE logs (foo INT, bar STRING, created_date TIMESTAMP)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '<=>'
STORED AS TEXTFILE;

이 테이블에 주기적으로 데이터를로드해야합니다.

LOAD DATA INPATH '/user/foo/data/logs' INTO TABLE logs;

그러나 데이터가 테이블에 제대로 삽입되지 않습니다. 구분 기호에 문제가있을 수 있습니다. 이유를 찾을 수 없습니다.

로그 라인 예 :

120<=>abcdefg<=>2016-01-01 12:14:11

select * from logs에서; 나는 얻다,

120  =>abcdefg  NULL

첫 번째 속성은 괜찮습니다. 두 번째는 구분 기호의 일부를 포함하지만 삽입되는 문자열이고 세 번째는 날짜 시간을 예상하므로 null입니다.

누구든지 사용자 지정 구분 기호를 제공하고 데이터를 성공적으로로드하는 방법에 대한 도움을받을 수 있습니까?

해결법

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

    1.기본적으로 하이브는 단일 문자를 필드 구분 기호로 사용할 수 있습니다. 다중 문자 구분 기호를 지정하는 RegexSerDe가 있지만 특히 아마추어에게는 사용하기가 어려울 수 있습니다.

    기본적으로 하이브는 단일 문자를 필드 구분 기호로 사용할 수 있습니다. 다중 문자 구분 기호를 지정하는 RegexSerDe가 있지만 특히 아마추어에게는 사용하기가 어려울 수 있습니다.

    패치 (HIVE-5871)는 MultiDelimitSerDe라는 새로운 SerDe를 추가합니다. MultiDelimitSerDe를 사용하면 일반 테이블 작성과 가장 유사한 방식으로 테이블 작성시 복수 문자 필드 구분 기호를 지정할 수 있습니다.

    hive> CREATE TABLE logs (foo INT, bar STRING, created_date TIMESTAMP)
        > ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe' 
        > WITH SERDEPROPERTIES ("field.delim"="<=>")
        > STORED AS TEXTFILE;
    
    hive> dfs -put /home/user1/multi_char.txt /user/hive/warehouse/logs/. ;
    
    hive> select * from logs;
    OK
    120 abcdefg 2016-01-01 12:14:11
    Time taken: 1.657 seconds, Fetched: 1 row(s)
    hive> 
    
  2. ==============================

    2.

    CREATE TABLE logs (foo INT, bar STRING, created_date TIMESTAMP)
    ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe'
    WITH SERDEPROPERTIES (
        "field.delim"="<=>",
        "collection.delim"=":",
        "mapkey.delim"="@"
    );
    

    테이블에 데이터로드

    load data local inpath '/home/kishore/Data/input.txt' overwrite into table logs;
    
  3. ==============================

    3.MultiDelimitSerDe에 대한 답변은 앞서 언급 한 답변을 참조하십시오. RegexSerDe로 시도해 볼 수도 있습니다. 그러나 RegexSerde가 기본적으로 String을 받아들이 기 때문에 데이터 유형에 파싱하는 추가 단계가 필요합니다.

    MultiDelimitSerDe에 대한 답변은 앞서 언급 한 답변을 참조하십시오. RegexSerDe로 시도해 볼 수도 있습니다. 그러나 RegexSerde가 기본적으로 String을 받아들이 기 때문에 데이터 유형에 파싱하는 추가 단계가 필요합니다.

    RegexSerDe는 하나의 단일 분리 문자로 균일하게 정렬되지 않은 데이터가있는 일부 로그 파일을 편리하게 처리합니다.

    CREATE TABLE logs_tmp  (foo STRING,bar STRING, created_date STRING) 
    ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' 
    WITH SERDEPROPERTIES (
     "input.regex" = "(\\d{3})<=>(\\w+)<=>(\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2})"
    ) 
    STORED AS TEXTFILE;
    
    LOAD DATA LOCAL INPATH 'logs.txt' overwrite into table logs_tmp;
    
    CREATE TABLE logs  (foo INT,bar STRING, created_date TIMESTAMP) ;
    
    INSERT INTO TABLE logs SELECT cast(foo as int) as foo,bar,cast(created_date as TIMESTAMP) as created_date from logs_tmp 
    

    산출:

       OK
        Time taken: 0.213 seconds    
        hive> select * from logs;
        120     abcdefg 2016-01-01 12:14:11
    
  4. from https://stackoverflow.com/questions/38825285/load-data-into-hive-with-custom-delimiter by cc-by-sa and MIT license