【问题标题】:Why does all columns get created as string when I use OpenCSVSerde in Hive?当我在 Hive 中使用 OpenCSVSerde 时,为什么所有列都被创建为字符串?
【发布时间】:2023-03-14 16:05:01
【问题描述】:

我正在尝试使用 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 解释了将数据类型更改为字符串。

【问题讨论】:

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


    【解决方案1】:

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

    看这里:CSVSerde这个confluence是关于CSVSerDe的,但是它使用了Open-CSV

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

    在这里:Hive "OpenCSVSerde" Changes Your Table Definition

    【讨论】:

    • 感谢分享链接。它的信息量很大。
    • 是否有不这样做的 CSV serde?​​span>
    • @johnsullivan AFAIK LazySimpleSerDe.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 2016-10-06
    相关资源
    最近更新 更多