csv 文件到 hive table 使用加载数据 - 如何格式化 csv 中的日期以被 hive table 接受
csv file to hive table using load data - How to format the date in csv to accept by hive table
我正在使用加载数据语法将 csv 文件加载到 table.The 文件,格式与 hive 接受的格式相同。但是仍然在发布加载数据之后,select.
上的最后 2 列 returns 为空
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 returns 最后 2 列的 NULL 值
另一个问题是如果日期格式与 YYYY-MM-DD 不同怎么办。是否可以让配置单元识别格式? (因为现在我正在修改 csv 文件格式以供 hive 接受)
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;
另请阅读:
将日期列定义为字符串并在 select 中应用转换。
第二个问题的答案:
您将需要一个额外的临时 table 来读取您的输入文件,然后您可以在您的插入 select statements.In 您的临时 table 存储中进行日期转换日期字段作为字符串。例如
create table dattable_ext(
DATANUM INT,
ENTRYNUM BIGINT,
START_DATE String,
END_DATE String)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
将数据加载到临时文件中table
LOAD DATA LOCAL INPATH '/path/dtatable.csv' OVERWRITE INTO TABLE dattable_ext;
从临时 table 插入托管 table。
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 文件加载到 table.The 文件,格式与 hive 接受的格式相同。但是仍然在发布加载数据之后,select.
上的最后 2 列 returns 为空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 returns 最后 2 列的 NULL 值
另一个问题是如果日期格式与 YYYY-MM-DD 不同怎么办。是否可以让配置单元识别格式? (因为现在我正在修改 csv 文件格式以供 hive 接受)
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;
另请阅读:
将日期列定义为字符串并在 select 中应用转换。
第二个问题的答案:
您将需要一个额外的临时 table 来读取您的输入文件,然后您可以在您的插入 select statements.In 您的临时 table 存储中进行日期转换日期字段作为字符串。例如
create table dattable_ext(
DATANUM INT,
ENTRYNUM BIGINT,
START_DATE String,
END_DATE String)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
将数据加载到临时文件中table
LOAD DATA LOCAL INPATH '/path/dtatable.csv' OVERWRITE INTO TABLE dattable_ext;
从临时 table 插入托管 table。
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 函数中的日期格式替换为您输入的日期格式。