【问题标题】:HIVE - Manual parse data enclosed by double quotes and separated by commaHIVE - 手动解析用双引号括起来并用逗号分隔的数据
【发布时间】:2017-07-06 17:45:03
【问题描述】:

我看到了一些类似的问题,但由于问题不完全相同,或者解决方案不适用于我的情况,所以我在这里发布我的问题。

我正在解析一个表,该表在 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 允许在 Create 表中定义分隔符和转义双引号,但我可能正在寻找可以设置的属性,或者可能是正则表达式,这可以以正确的方式进行拆分。

提前致谢

【问题讨论】:

  • “手动解析”是什么意思?为什么不使用 CSV SerDe?
  • 手动解析,在 hive 中进行。我需要计算几个 csv 文件并将它们合并到一个表中。除了其他计算。我需要查询来执行这项工作。 :/ 也许我需要用 Spark 来做这件事..
  • 那么,为什么不使用 CSV SerDe?
  • 如何使用它,而不是在 create table 语句中?
  • 不清楚。请给出一个反映实际场景的数据样本,包括所需的结果。

标签: csv parsing hadoop split hive


【解决方案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 |
+--------+--------+--------+-----+-----+-----------------------------------------------------------------------------------------------------+------------+-----+-----------------+-----+

【讨论】:

  • 这行得通,很好的正则表达式,非常感谢。数据结构有点复杂。至少到目前为止这似乎运作良好:)
  • 鉴于您提到的正则表达式,是否有可能创建一个数组(使用拆分),每个索引将保留不同的组?这样运行查询会更快,因为正则表达式将运行一次,然后可以从数组中检索数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 2022-01-26
  • 2015-08-05
相关资源
最近更新 更多