2017-11-24 9 views
0

textファイルからHive外部テーブルに以下のデータを解析してロードしようとしています。ハイブ:エスケープ文字やその他の特殊文字も含むパイプ区切りデータの解析

例。データ:

"100'082 \"|"ABC~01"|"Mana|ger1 \"|"[email protected]'a`il.com" 

クエリの下に使用するには:

create external table test3 
(EmpID STRING, 
EmpName STRING, 
Designation STRING, 
Email STRING) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe' 
WITH SERDEPROPERTIES ('field.delim'='"|"') 
STORED AS TEXTFILE 
location '/home/hdp/samplefiles' 
tblproperties ('skip.header.line.count'='1'); 

データは

| "100'082 \ | ABC~01   | Mana|ger1 \  | [email protected]"a`il.com" | 

として表にロードされたしかし、私はせずに、この

| 100'082 \ | ABC~01   | Mana|ger1 \  | [email protected]"a`il.com | 

のようなデータが必要cの開始時に二重引用符olumn1とcolumn4

答えて

0

利用MultiDelimitSerDeの代わりにオープンOpenCsvSerdeの終わりインチ以下のクエリを使用して、それは質問に期待どおりに動作します。

CREATE EXTERNAL TABLE test3 (EmpID STRING, 
EmpName STRING, 
Designation STRING, 
Email STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES('separatorChar' = '|\|"|\||"\|"|"','quoteChar'= '\"','escapeChar'= '\,') 
STORED AS TEXTFILE LOCATION '/home/hdp/samplefiles' 
tblproperties ('skip.header.line.count'='1'); 

選択クエリの結果は次のようになります。

hive> select * from test3; 
OK 
100'082 \  ABC~01 Mana|ger1 \  [email protected]'a`il.com 
+0

おかげでアミットは、私は、例えば、データの結果を得ました..しかし、私の生産データにいくつかのいくつかの二重引用符の間で存在していますこの「ABC01する@ M」のようなデータa'il.com」。このため任意の解決策はあります。karthik16 @ – karthik16

+0

。ビルトインOpenCSVSerdeはopencsvライブラリを使用して、それは二重引用符のさえnumersを扱うことができるように見えます。以降の例ではあなたは "ABC01 @ m" a'il.com "の上に与えて、二重引用符の奇数があります。つまり、終わり引用符がないぶら下げ引用符があります。これらの状況は、スパーク2以上で完全に処理されます。スパークでは、これらすべてのシナリオを処理できるdatabricks csv libraryを使用しています。 databricks csvライブラリを使用して、カスタムserdeを作成できます。 –

+0

はもう一度感謝アミットは、databricks CSVライブラリが内部的にあなたのserdeを作成するためのuniVocity CSV parsers.Use uniVocityを使用しています.. databricks CSVライブラリとの情報については – karthik16

関連する問題