我正在尝试从CSV文件(latlong.csv)导入数据,并且希望从列中删除所有引号。请参考第一张图片。
这是我用来导入数据的代码
CREATE TABLE IF NOT EXISTS latlong
(COUNTRY String, ALPHA2 String, ALPHA3 String, NUMERICCODE String,
LATITUDE String, LONGITUDE String)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
tblproperties("skip.header.line.count"="1");
LOAD DATA LOCAL INPATH '/tmp/project2/latlong.csv' INTO TABLE latlong;
我尝试使用下面的命令,但出现错误。错误说我只能插入表中而不能更新它(我认为)。
Update latlong set country = replace(country, '"', '')
要以非事务方式更新表,请使用INSERT OVERWRITE。双引号需要屏蔽。使用["]
或双斜线\\"
:
insert overwrite table latlong
select regexp_replace(COUNTRY, '["]', '') COUNTRY, --this will remove double-qutes
ALPHA2, ALPHA3, NUMERICCODE, LATITUDE, LONGITUDE
from latlong;
如果字符串中包含引号并且要删除它们,则此解决方案适用。
如果像在数据示例中一样,用引号引起来,则在反序列化期间使用SerDe删除引号,这样会更加有效。只需使用适当的SerDe和属性创建表:
drop table latlong;
CREATE TABLE latlong
(COUNTRY String, ALPHA2 String, ALPHA3 String, NUMERICCODE String,
LATITUDE String, LONGITUDE String)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES
(
"separatorChar" = ",",
"quoteChar" = "\""
)
STORED AS TEXTFILE
tblproperties("skip.header.line.count"="1");
;
LOAD DATA LOCAL INPATH '/tmp/project2/latlong.csv' INTO TABLE latlong;