2013-03-04 3 views
2

아무도 말할 수 : 하이브 테이블을 만들 수 고정 된 오프셋을 통해 값을 분리. 예 : 파일 : col1 col2 col3 이 경우 1 - 4 자의 문자는 표의 첫 번째 열, 5-8 자의 두 번째 열, 8-12 자의 문자를 나타냅니다.고정 오프셋으로 하이브 필드 delimeter

고맙습니다.

+0

https://groups.google.com/ a/cloudera.org/forum /? fromgroups = #! topic/cdh-user/9xvU0RyqKPA –

+1

http://stackoverflow.com/questions/1309700/regex-for-fixed-width-field –

답변

3

는 I 유사한 문제점이 방법으로 해결했다 :

개행 구분 행 고정 오프셋 열 입력

첫 번째 입력이 주어 한 컬럼의 테이블로 데이터 문자열

그런 다음 자바 클래스 또는 한 줄에 걸리는 스트리밍 Hadoop을 통해 파이썬 모듈 중 하나를 통과하고, 반환 여러 필드 :

import sys 

for line in sys.stdin: 
    # line will have a newline on the end you don't want 
    line = line.strip() 
    output = [] 
    output.append(line[:4]) 
    output.append(line[4:8]) 
    output.append(line[8:12]) 
    print '\t'.join(output) 

귀하의 하이브의 cript는 다음과 같이 표시됩니다

CREATE TABLE IF NOT EXISTS input_raw(line STRING); 

LOAD DATA LOCAL INPATH '${hiveconf:input}' OVERWRITE INTO TABLE input_raw; 

CREATE TABLE IF NOT EXISTS processed_data(
field1 STRING, 
field2 STRING 
field3 STRING); 

delete FILE processing.py; 

add FILE processing.py; 

INSERT INTO TABLE processed_data 
SELECT 
TRANSFORM (line) 
USING 'python processing.py' 
AS(field1, field2, field3) 
FROM input_raw; 

DROP TABLE input_raw; 
3

당신은 또한 당신의 접근 방식에 따라, 그러나 하이브 SUBSTR()를 사용하여 스트리밍 및 파이썬 그 모두를 피할 수

CREATE TABLE IF NOT EXISTS input_raw(line STRING); 

LOAD DATA LOCAL INPATH '${hiveconf:input}' OVERWRITE INTO TABLE input_raw; 

CREATE TABLE IF NOT EXISTS processed_data(
field1 STRING, 
field2 STRING 
field3 STRING); 

INSERT INTO TABLE processed_data 
SELECT 
substr(line,1,4) as field1, 
substr(line,5,4) as field2, 
substr(line,9,4) as field3 
FROM input_raw; 

DROP TABLE input_raw; 
+0

나는 그 프로젝트에 아직도있을 때 :) –