1

我正在尝试将 CSV 文件数据加载到我的 Hive 表中,但它在一列的值中有 delimiter(,) ,因此 Hive 将其作为分隔符并将其加载到新列中。我尝试使用转义序列 \ 但我也 \ (它不工作并且总是在新列中加载数据,.

我的 CSV 文件:

        id,name,desc,per1,roll,age
        226,a1,"\"double bars","item1 and item2\"",0.0,10,25
        227,a2,"\"doubles","item2 & item3 item4\"",0.1,20,35
        228,a3,"\"double","item3 & item4 item5\"",0.2,30,45
        229,a4,"\"double","item5 & item6 item7\"",0.3,40,55

我已经更新了我的表格。:

    create table testing(id int, name string, desc string, uqc double, roll int, age int) 
    ROW   FORMAT SERDE 
    'org.apache.hadoop.hive.serde2.OpenCSVSerde'
     WITH SERDEPROPERTIES (
    "separatorChar" = ",",
    "quoteChar" = '"',
    "escapeChar" = "\\" ) STORED AS textfile;

但是我仍然在之后的不同列中获取数据。

我在路径命令中使用加载数据。

4

1 回答 1

1

这是基于 RegexSerDe 创建表的方法。

每列应该()在正则表达式中有相应的捕获组。您可以轻松调试正则表达式,而无需使用以下方法创建表regex_replace

select regexp_replace('226,a1,"\"double bars","item1 and item2\"",0.0,10,25',
                      '^(\\d+?),(.*?),"(.*)",([0-9.]*),([0-9]*),([0-9]*).*', --6 groups
                     '$1 $2 $3 $4 $5 $6'); --space delimited fields 

结果:

226 a1 "double bars","item1 and item2" 0.0 10 25

如果看起来不错,请创建表:

 create external table testing(id int, 
                      name string, 
                      desc string, 
                      uqc double, 
                      roll int, 
                      age int
                     ) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' 
WITH SERDEPROPERTIES ('input.regex'='^(\\d+?),(.*?),"(.*)",([0-9.]*),([0-9]*),([0-9]*).*')
location ....
TBLPROPERTIES("skip.header.line.count"="1")
;

阅读这篇文章了解更多详情。

于 2021-01-07T17:15:28.010 回答