如何在配置单元中使用CSV serde加载带有嵌入双引号的CSV数据。不更新传入的数据文件
我有如下文本文件:如何在配置单元中使用CSV serde加载带有嵌入双引号的CSV数据。不更新传入的数据文件,csv,hadoop,hive,Csv,Hadoop,Hive,我有如下文本文件: 1,"TEST"Data","SAMPLE DATA" 表结构如下所示: 创建表test1(id字符串、col1字符串、col2字符串) 行格式SERDE'org.apache.hadoop.hive.serde2.OpenCSVSerde' 存储为INPUTFORMAT'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextO
1,"TEST"Data","SAMPLE DATA"
表结构如下所示:
创建表test1(id字符串、col1字符串、col2字符串)
行格式SERDE'org.apache.hadoop.hive.serde2.OpenCSVSerde'
存储为INPUTFORMAT'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
位置“mylocation/test1”`
当我将文件放入相关的HDFS位置时。第2列和第03列填充为null
,这是因为中间有双引号(TEST“Data)
一种方法是使用转义字符“/”更新数据文件,但我们不允许更新传入的数据。如何正确加载数据并转义这些嵌入的双引号
感谢您的帮助!!您可以使用RegexSerDe
create external table test1
(
id string
,col1 string
,col2 string
)
row format serde 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
with serdeproperties
(
'input.regex' = '^(\\d+?),"(.*)","(.*)"$'
)
location '/tmp/test1'
;
演示
bash
mkdir test1
蜂巢
create external table test1
(
id string
,col1 string
,col2 string
)
row format serde 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
with serdeproperties
(
'input.regex' = '^(\\d+?),"(.*)","(.*)"$'
)
location '/tmp/test1'
;
你还在这儿吗?
create external table test1
(
id string
,col1 string
,col2 string
)
row format serde 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
with serdeproperties
(
'input.regex' = '^(\\d+?),"(.*)","(.*)"$'
)
location '/tmp/test1'
;
select * from test1
;
+----------+----------------------+-------------+
| test1.id | test1.col1 | test1.col2 |
+----------+----------------------+-------------+
| 1 | TEST"Data | SAMPLE DATA |
| 2 | TEST Data | SAMPLE DATA |
| 3 | TEST","Data","SAMPLE | DATA |
+----------+----------------------+-------------+