【问题标题】:remove surrounding quotes from fields while loading data into hive在将数据加载到配置单元时从字段中删除周围的引号
【发布时间】:2016-12-01 18:01:50
【问题描述】:

我想将带有输入数据的表加载到配置单元中。我有以下格式的数据。

"153662";"0002241447";"0"
"153662";"000647036X";"0"
"153662";"0020434901";"0"
"153662";"0020973403";"0"
"153662";"0028604202";"0"
"153662";"0030437512";"0"

我想将此数据加载到具有两个 varchar 列和一个 int 列的表中。但是周围的双引号困扰着我。我创建了下表。

CREATE EXTERNAL TABLE Table(A varchar(50),B varchar(50),C varchar(50))
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\;'
LINES TERMINATED BY '\n'

STORED AS TEXTFILE

但字段周围的引号也成为字段的一部分,如下所示。

"276725"    "034545104X"    "0"
"276726"    "0155061224"    "5"

我想忽略它们。此外,我希望将第三个字段读取为 INT。目前,当我在制作表格时将第三个字段作为 INT 提供时,它变为 NULL。

【问题讨论】:

    标签: hadoop hive


    【解决方案1】:

    实现这一目标的多种方法:

    1. 使用 CSV serde
    2. 使用正则表达式 serde- regex "\"(.*)\"\;\"(.*)\"\;\"(.*)\""
    3. 将数据加载到外部表然后删除双引号:

    创建外部表源( 一个字符串, b 字符串, c 字符串) 以“\;”结尾的行格式分隔字段位置'xyz';

    CREATE TABLE 目标 AS SELECT REGEXP_REPLACE(a,'"',''), REGEXP_REPLACE(b,'"',''), CAST (REGEXP_REPLACE(c,'"','') AS BIGINT) FROM source ;

    【讨论】:

      【解决方案2】:

      您必须为此使用Csv-Serde

      CREATE TABLE Table(A varchar(50),B varchar(50),C varchar(50))
      ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
      WITH SERDEPROPERTIES 
      (
          "separatorChar" = ";",
          "quoteChar"     = "\""
      )  
      STORED AS TEXTFILE;
      

      【讨论】:

      • 我不想使用 SERDE,因为我不完全理解它。是否有相同的本地蜂巢功能?我在使用它时也会遇到问题。我收到以下错误:失败:执行错误,从 org.apache.hadoop.hive.ql.exec.DDLTask 返回代码 1。无法验证 serde:org.apache.hadoop.hive.serde2.OpenCSVSerde
      • 您必须使用与发行版兼容的 serde jar。
      • 请注意,Impala 不支持此 SerDe。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 1970-01-01
      • 2021-08-11
      相关资源
      最近更新 更多