Hive - 复杂的regexp_replace

时间:2016-08-09 12:35:57

标签: csv hadoop hive

我不是正则表达的专家,而且我在Hive中使用regexp_replace时会遇到问题。

我想将CSV文件加载到Hive中,其中包含类似的行:

AAA,1234,BBB,,,"""CC,CCC""","""DDD""","""EE"EEE""",,
"""AAA""",1234,BBB,,,CCCC,"""DD,DD""",,"""FFFF""",

如您所见,格式并非完美

  • 字符串字段中有非转义逗号
  • 某些字符串字段包含在""" (3份双引号)
  • 字符串字段中有非转义双引号
  • 有空字段

当我尝试将其导入Hive表时,由于没有转义的逗号,因此未对列进行很好的解析。

所以我将原始数据作为行导入到Hive表中,如下所示:

CREATE EXTERNAL TABLE MyRawTable
(
    RAW_DATA STRING
)
STORED AS TEXTFILE
LOCATION '/path/to/hdfs/file'

我试图使用regexp_replace函数来转换行:

  • 转义逗号,字符串字段中的双引号和简单引号
  • 不用双引号括起字符串字段

所以数据看起来像这样:

AAA,1234,BBB,,,CC\,CCC,DDD,EE\"EEE,,
AAA,1234,BBB,,,CCCC,DD\,DD,,FFFF,

我找不到这个正则表达式的解决方案,任何想法?非常感谢!

1 个答案:

答案 0 :(得分:1)

忘掉正则表达式,你不需要它。逗号不会被转义,但它们被双引号括起来。您只需使用OpenCSVSerde

即可
CREATE EXTERNAL TABLE yourtable(foo int, bar string) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   "separatorChar" = ",",
   "quoteChar"     = "\"",
   "escapeChar"    = "\""
)  
LOCATION '/your/folder/containing/csv/files/';
相关问题