使用加载数据将csv文件复制到hive表-如何在csv中格​​式化日期以被hive表接受

时间:2019-01-31 12:01:32

标签: csv hive create-table hive-serde

我正在使用加载数据语法将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不同。是否可以让配置单元识别格式? (因为现在我正在修改csv文件格式以被配置单元接受)

2 个答案:

答案 0 :(得分:2)

第二个问题的答案:

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

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函数中的日期格式。

答案 1 :(得分:1)

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

将日期列定义为字符串,并在select中应用转换。