【问题标题】:csv file to hive table using load data - How to format the date in csv to accept by hive tablecsv 文件使用加载数据到 hive 表 - 如何格式化 csv 中的日期以由 hive 表接受
【发布时间】:2019-06-24 21:19:38
【问题描述】:

我正在使用加载数据语法将 csv 文件加载到表中。该文件与 hive 接受的格式相同。但仍然在发出加载数据后,最后 2 列在选择时返回 null。

1750,651,'2013-03-11','2013-03-17'
1751,652,'2013-03-18','2013-03-24'
1752,653,'2013-03-25','2013-03-31'
1753,654,'2013-04-01','2013-04-07'

create table dattable(
DATANUM    INT,  
ENTRYNUM BIGINT, 
START_DATE  DATE,
END_DATE    DATE ) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

 LOAD DATA LOCAL INPATH '/path/dtatable.csv' OVERWRITE INTO TABLE dattable ;

Select 返回最后 2 列的 NULL 值

另一个问题是,如果日期格式不同于 YYYY-MM-DD,该怎么办。是否可以让 hive 识别格式? (因为现在我正在修改 csv 文件格式以被 hive 接受)

【问题讨论】:

    标签: csv hive create-table hive-serde hiveddl


    【解决方案1】:

    回答你的第二个问题:

    您将需要一个额外的临时表来读取您的输入文件,然后您可以在您的插入选择语句中进行日期转换。在您的临时表中,将日期字段存储为字符串。例如。

    create table dattable_ext(
    DATANUM    INT,  
    ENTRYNUM BIGINT, 
    START_DATE  String,
    END_DATE    String) 
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
    

    将数据加载到临时表中

    LOAD DATA LOCAL INPATH '/path/dtatable.csv' OVERWRITE INTO TABLE dattable_ext;
    

    从临时表插入到托管表。

    insert into table dattable select DATANUM, ENTRYNUM,
    from_unixtime(unix_timestamp(START_DATE,'yyyy/MM/dd'),'yyyy-MM-dd'),
    from_unixtime(unix_timestamp(END_DATE,'yyyy/MM/dd'),'yyyy-MM-dd') from dattable_ext;
    

    您可以将 unix_timestamp 函数中的日期格式替换为您输入的日期格式。

    【讨论】:

    • 当 csv 文件日期格式为 dd-mm-yyyy 或 mm-dd-yyyy 或 yyyy/mm/dd 时,上述解决方案将起作用
    • @vikrantrana 是的,它适用于所有可接受的日期时间格式,只要它与列的内容匹配
    【解决方案2】:

    LasySimpleSerDe(默认)不适用于带引号的 CSV。使用CSVSerDe:

    create table dattable(
    DATANUM    INT,  
    ENTRYNUM BIGINT, 
    START_DATE  DATE,
    END_DATE    DATE ) 
    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
    WITH SERDEPROPERTIES (
       "separatorChar" = ",",
       "quoteChar"     = "'"
    )  
    STORED AS TEXTFILE;
    

    另请阅读:CSVSerDe treats all columns to be of type String

    将您的日期列定义为字符串并在选择中应用转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-13
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多