2017-02-08 1 views
-1

나는 hadoop에서 초보자이며 하이브의 테이블에 데이터를 추가해야합니다. 나는 9=66 9, 해당 컬럼의 값으로 열 이름으로 8=FIX.4.4 8, FIX4.4 프로토콜이 같은 ... 첫째다음 시나리오에서 테이블에 데이터를 삽입하는 방법은 무엇입니까?

8=FIX.4.4<SHO>9=85<SHO>35=A<SHO>34=524<SHO>49=SSGMdemo<SHO>52=20150410-15:25:55.795<SHO>56=Trumid<SHO>98=0<SHO>108=30<SHO>554=TruMid456<SHO>10=154<SHO> 
8=FIX.4.4<SHO>9=69<SHO>35=A<SHO>34=1<SHO>49=Trumid<SHO>52=20150410-15:25:58.148<SHO>56=SSGMdemo<SHO>98=0<SHO>108=30<SHO>10=093<SHO> 
8=FIX.4.4<SHO>9=66<SHO>35=2<SHO>34=2<SHO>49=Trumid<SHO>52=20150410-15:25:58.148<SHO>56=SSGMdemo<SHO>7=1<SHO>16=0<SHO>10=174<SHO> 
8=FIX.4.4<SHO>9=110<SHO>35=5<SHO>34=525<SHO>49=SSGMdemo<SHO>52=20150410-15:25:58.164<SHO>56=Trumid<SHO>58=MsgSeqNum too low, expecting 361 but received 1<SHO>10=195<SHO> 

, 내가 원하는 것은 데이터를 가지고 있고, FIX.4.4 컬럼 이름이어야하고 66은 그 컬럼의 값이 될 것입니다. 그리고 .... 이와 같이 원시 파일에는 많은 행이 있습니다.

둘째, 다른 행에 대해 동일한 작업을 수행하고 해당 데이터가 하이브에있는 테이블의 다음 행에 추가됩니다.

이제 어떻게해야 나는 생각할 수 없습니까?

도움이 될만한 도움이 될 것입니다.

+0

어떻게 일반적으로 데이터를 가져오고 있습니다를 추출하기 위해 아래의 SELECT 문을 사용할 수 있습니까? 어떤 도구/프로그래밍 언어를 사용합니까? 오히려 간단한 정규식을 사용하면 아마 열 및 값 쌍을 필터링 할 수 있습니다. 이 쌍을 사용하면 쉽게 하이브로 가져올 수있는 CSV를 만드는 것이 어렵지 않습니다. – spijs

+0

이 파일의 정규식을 만들고이를 CSV로 변환하는 방법은 무엇입니까? @spijs –

답변

0

먼저이 데이터가 포함 된 탭 구분 파일을 만듭니다. 주석에 정규 표현식을 사용하도록 제안했으나 강한 적합성이 아니라면 <SHO> 태그와 = 태그로 나눌 수 있습니다. 사용할 언어를 지정하지 않았으므로 파이썬에서 '해결책'을 제안 할 것입니다. 아래 코드는 입력 행 중 하나를 CSV 파일에 쓰는 방법을 보여줍니다. 이 파일은 이미 생성 된 CSV 파일에 여러 줄을 추가하거나 줄을 추가하기 위해 쉽게 확장 할 수 있습니다.

import csv 
input = "8=FIX.4.4<SHO>9=85<SHO>35=A<SHO>34=524<SHO>49=SSGMdemo<SHO>52=20150410-15:25:55.795<SHO>56=Trumid<SHO>98=0<SHO>108=30<SHO>554=TruMid456<SHO>10=154<SHO>" 
l = input.split('<SHO>')[:-1] # Don't include last element since it's empty 
list_of_pairs = map(lambda x: tuple(x.split('=')),l) 
d = dict(list_of_pairs) 

with open('test.tsv', 'wb') as c: 
cw = csv.writer(c, delimiter='\t') 
cw.writerow(d.keys()) # Comment this if you don't want to have a header 
cw.writerow(d.values()) 

은 무엇이 코드가하는 일은 처음이 col=val 문자열 목록을 생성 의미 <SHO>의 입력 라인을 분할됩니다. 내가 할 일은 각 튜플이 (col,val) 인 튜플 쌍의 목록을 만드는 것입니다. 그런 다음이 코드를 사용하여 사전을 생성합니다.이 코드는 꼭 필요한 것은 아니지만 더 많은 행을 위해 코드를 확장하려는 경우 도움이 될 수 있습니다. 다음 헤더와 값을 포함하는 탭 구분 값 파일 test.tsv를 만듭니다.

이제 하이브가 이해할 수있는 파일이 있습니다. CSV 또는 탭 구분 값 파일 가져 오기에 대한 많은 기사를 찾을 수있을 것입니다.하지만 HDFS에있는 파일을 가져 오는 데 사용할 수있는 일반적인 하이브 쿼리의 예를 제공 할 것입니다.

CREATE TABLE if not exists [database].[table] 
([Col1] Integer, [Col2] Integer, [Col3] String,...) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
LINES TERMINATED BY '\n' 
TBLPROPERTIES('skip.header.line.count'='1'); 

LOAD DATA inpath '[HDFS path]' 
overwrite INTO TABLE [database].[table]; 

희망 사항은 진행 방법에 대한 더 나은 아이디어를 제공합니다.

+0

글쎄, 리더에게 물어 본 후에, 나는 자바 만 선택해야하지만, 위의 로직을 java로 변환 할 수있다. 감사합니다. –

+0

이것이 당신의 질문을 해결한다면, 다른 사람들도 그것이 유용하다는 것을 알 수 있도록 대답을 수락하는 것을 고려하십시오 :). 도와 줘서 기뻐요. – spijs

0

복사 HDFS에 파일을 하나의 열 (C8)의 외부 테이블을 생성 후 각 열

create external table tablename(
c8 string) 
STORED AS TEXTFILE 
location 'HDFS path'; 


select regexp_extract(c8,'8=(.*?)<SHO>',1) as c8, 
regexp_extract(c8,'9=(.*?)<SHO>',1) as c9, 
regexp_extract(c8,'35=(.*?)<SHO>',1) as c35, 
regexp_extract(c8,'34=(.*?)<SHO>',1) as c34, 
regexp_extract(c8,'49=(.*?)<SHO>',1) as c49, 
regexp_extract(c8,'52=(.*?)<SHO>',1) as c52, 
regexp_extract(c8,'56=(.*?)<SHO>',1) as c56, 
regexp_extract(c8,'98=(.*?)<SHO>',1) as c98, 
regexp_extract(c8,'108=(.*?)<SHO>',1) as c108, 
regexp_extract(c8,'554=(.*?)<SHO>',1) as c554, 
regexp_extract(c8,'35=(.*?)<SHO>',1) as c10 
from tablename