2017-02-08 16 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はそのカラムの値となります。このように、生のファイルには非常に多くの行があります。

第2に、別の行についても同じことです。そのデータは、ハイブのテーブルの次の行に追加されます。

今私は何をすべきか、私は考えることができません。

助けがあれば助かります。

+0

どのようにして、通常のデータにもたらしているを抽出するために、次のselect文を使うのか?どのツール/プログラミング言語を使用していますか?かなりシンプルな正規表現を使うと、おそらく列と値のペアを除外できます。これらのペアを使用すると、簡単にハイブにインポートできるCSVを作成するのは難しくありません。 – spijs

+0

このファイルの正規表現をCSVに変換するには? @spijs –

答えて

0

まず、このデータを含むタブ区切りファイルを作成します。私はコメントに正規表現を使用することを提案しましたが、それがあなたの強い訴訟ではない場合は、<SHO>タグと=タグに分けることができます。あなたが使用したい言語を指定しなかったので、私はPythonで '解決策'を提案します。 以下のコードは、入力行の1つをCSVファイルに書き込む方法を示しています。 これを簡単に拡張して、これらの行の複数をサポートしたり、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を作成します。

これは、Hiveが理解できるファイルがあることを意味します。 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だけを選択しなければなりませんが、私は上記のロジックを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 
関連する問題