代码之家  ›  专栏  ›  技术社区  ›  ForeverLearner

当我在Hive中使用OpenCSVSerde时,为什么所有列都被创建为字符串?

  •  7
  • ForeverLearner  · 技术社区  · 6 年前

    我正在尝试使用OpenCSVSerde和一些整数和日期列创建一个表。但这些列会转换为字符串。这是预期的结果吗? 作为一种解决方法,我在这一步之后执行显式类型转换(这会使整个运行变慢)

    hive> create external table if not exists response(response_id int,lead_id int,creat_date date ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ('quoteChar' = '"', 'separatorChar' = '\,', 'serialization.encoding'='UTF-8', 'escapeChar' = '~')   location '/prod/hive/db/response' TBLPROPERTIES ("serialization.null.format"="");
    OK
    Time taken: 0.396 seconds
    hive> describe formatted response;
    OK
    # col_name              data_type               comment
    
    response_id             string                  from deserializer
    lead_id                 string                  from deserializer
    creat_date              string                  from deserializer
    

    Source Code 这解释了将数据类型更改为字符串的原因。

    1 回复  |  直到 5 年前
        1
  •  7
  •   leftjoin    3 年前

    这就是已知的CSVSerDe serde的局限性。CSVSerDe将所有列视为字符串类型。即使使用此SerDe创建具有非字符串列类型的表,描述表输出也会显示字符串列类型。从SerDe检索类型信息。要将列转换为表中所需的类型,可以在表上创建一个视图,将其转换为所需的类型。

    请参见此处: CSVSerde 此汇流是关于CSVSerDe的,但它使用开放CSV

    另请参见此处: https://docs.aws.amazon.com/athena/latest/ug/csv.html

    这里: Hive "OpenCSVSerde" Changes Your Table Definition