2017-07-06 432 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

鉴于你提到的正则表达式,是否有可能创建一个数组(使用拆分)什么将保持每个索引不同的组?这样运行查询会更快,因为正则表达式只运行一次,然后可以从数组中检索数据。 –