2017-07-06 59 views
0

我見過一些類似的問題,但由於問題不完全相同,或者解決方案不適用於我的情況,所以我在此處發佈我的問題。HIVE - 用雙引號括起來的手動解析數據,用逗號分隔

我解析了一個包含csv_line列中的csv行的表。 問題是某些列有逗號,,這也是字段分隔符。這些列嵌入在引號中。

我做的解析是:

with 
sample as (
select 'field1,field3,"http://another.domain/abc/...eIds=111,222,333,444,...,",CustomerX,end' as csv_line) 

select 

regexp_extract(csv_line,'(,?(".*?"|[^,]*)){1}') as f1 
regexp_extract(csv_line,'(,?(".*?"|[^,]*)){n}') as fn 

from raw_sample 

我試圖替換字符/逗號。

我知道OpenCSVSerde允許定義的分隔符和轉義雙引號,在創建表,但我期待或許可以設置,或者是正則表達式的屬性時,可以做以正確的方式分割。提前

感謝

+0

你說的 「人工分析」 是什麼意思?爲什麼不使用CSV SerDe? –

+0

手動解析,在配置單元中執行。我需要計算幾個csv文件並將tham合併到一個表中。除了其他計算。我需要查詢來執行這項工作。 :/也許我需要用Spark做到這一點.. –

+0

那麼,爲什麼不使用CSV SerDe? –

回答

1
with raw_sample as (
select 'field1,field2,fiend3,123,456,"http://some.domain/abc/Player.aspx?playerID=111&BrowseIds=2221,423062611,423870887,424044345,...,",THIS_IS_MY,en,20 294 998 1001,end' as raw_line 
) 

select regexp_extract(raw_line,'(,?(".*?"|[^,]*)){01}',2) as c01 
     ,regexp_extract(raw_line,'(,?(".*?"|[^,]*)){02}',2) as c02 
     ,regexp_extract(raw_line,'(,?(".*?"|[^,]*)){03}',2) as c03 
     ,regexp_extract(raw_line,'(,?(".*?"|[^,]*)){04}',2) as c04 
     ,regexp_extract(raw_line,'(,?(".*?"|[^,]*)){05}',2) as c05 
     ,regexp_extract(raw_line,'(,?(".*?"|[^,]*)){06}',2) as c06 
     ,regexp_extract(raw_line,'(,?(".*?"|[^,]*)){07}',2) as c07 
     ,regexp_extract(raw_line,'(,?(".*?"|[^,]*)){08}',2) as c08 
     ,regexp_extract(raw_line,'(,?(".*?"|[^,]*)){09}',2) as c09 
     ,regexp_extract(raw_line,'(,?(".*?"|[^,]*)){10}',2) as c10 

from raw_sample 
; 

+--------+--------+--------+-----+-----+-----------------------------------------------------------------------------------------------------+------------+-----+-----------------+-----+ 
| c01 | c02 | c03 | c04 | c05 |             c06             | c07  | c08 |  c09  | c10 | 
+--------+--------+--------+-----+-----+-----------------------------------------------------------------------------------------------------+------------+-----+-----------------+-----+ 
| field1 | field2 | fiend3 | 123 | 456 | "http://some.domain/abc/Player.aspx?playerID=111&BrowseIds=2221,423062611,423870887,424044345,...," | THIS_IS_MY | en | 20 294 998 1001 | end | 
+--------+--------+--------+-----+-----+-----------------------------------------------------------------------------------------------------+------------+-----+-----------------+-----+ 
+0

這很有效,很好的正則表達式,並且非常感謝。數據結構有點複雜。至少這似乎工作到目前爲止:) –

+0

鑑於你提到的正則表達式,是否有可能創建一個數組(使用拆分)什麼將保持每個索引不同的組?這樣運行查詢會更快,因爲正則表達式只運行一次,然後可以從數組中檢索數據。 –

相關問題