[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.기본적으로 하이브는 단일 문자를 필드 구분 기호로 사용할 수 있습니다. 다중 문자 구분 기호를 지정하는 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.
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.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
from https://stackoverflow.com/questions/38825285/load-data-into-hive-with-custom-delimiter by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 쪽모이 세공의 장점과 단점은 다른 형식에 비해 무엇입니까? (0) | 2019.06.02 |
---|---|
[HADOOP] .NET과 동등한 Apache Hadoop이 있습니까? [닫은] (0) | 2019.06.02 |
[HADOOP] keytab을 사용하여 보안 Kerberos 인증 클러스터에서 하이브에 연결 (0) | 2019.06.02 |
[HADOOP] java.lang.NoClassDefFoundError : org / apache / hadoop / fs / StorageStatistics (0) | 2019.06.02 |
[HADOOP] Mainframe에서 Hadoop으로 데이터를 가져 오는 방법 (0) | 2019.06.02 |