【问题标题】:How do I remove text from columns in HIVE (sql)如何从 HIVE (sql) 中的列中删除文本
【发布时间】:2020-03-26 00:22:56
【问题描述】:

我正在尝试从 CSV 文件 (latlong.csv) 导入数据,并且我想从列中删除所有引号。请参考第一张图片。

First image

这是我用来导入数据的代码

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, '"', '')

error message

【问题讨论】:

标签: hadoop hive bigdata create-table hive-serde


【解决方案1】:

要更新不在事务模式下的表,请使用 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 将在选择期间删除引号,无需更新表格。

【讨论】:

    猜你喜欢
    • 2019-05-30
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多