如何从配置单元(sql)中的列中删除文本

nukf8bse  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(336)

我正在尝试从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, '"', '')

错误消息

avwztpqn

avwztpqn1#

要更新不在事务模式下的表,请使用insert overwrite。双引号需要屏蔽。使用 ["] 或双斜杠 \\" :

insert overwrite table latlong
select regexp_replace(COUNTRY, '["]', '') COUNTRY, --this will remove double-qutes from COUNTRY column
       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;

serde将在select期间删除引号,无需更新表。

相关问题