如何读取放置在 HDFS 上的 csv/tsv 文件的时间戳列,当一个包含 Timestamp 类型字符串列的 csv/tsv 文件被放置在 HDFS 上,读入一个表,然后需要将该列插入另一个表的过程。我想知道 csv / tsv 文件的 Timestamp 类型字符串是否可以像 Hive 的 Timestamp 类型一样读取?
发现:
1. 如果您使用的是 Hive 1.2.0 或更高版本
如果创建了表,将时间戳格式设置为读取csv/tsv文件的表的serdeproperty,如下所示:
ALTER TABLE hogehoge_table SET SERDEPROPERTIES ("timestamp.formats"="yyyy-MM-dd HH:mm:ss");
从现在开始创建表时,最好使用 DDL 进行设置。
CREATE EXTERNAL TABLE hogehoge_table (
column_1 STRING,
column_2 INT,
target_column TIMESTAMP
)
PARTITIONED BY (
partition_column STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
WITH SERDEPROPERTIES (
"timestamp.formats"="yyyy-MM-dd HH:mm:ss"
)
LOCATION '<your hdfs file location>'
;
|
在任何情况下,target_column 都可以选择为 Hive 的时间戳格式。
2. Hive 1.2.0以前版本
创建表读取csv/tsv文件时,设置为unixtime格式而不是Timestamp类型的字符串。
CREATE EXTERNAL TABLE hogehoge_table (
column_1 STRING,
column_2 INT,
target_column BIGINT
)
PARTITIONED BY (
partition_column STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
LOCATION '<your hdfs file location>'
;
|
将它插入另一个表时,它会被 SELECT 语句转换:
INSERT OVERWRITE TABLE fugafuga_table
PARTITION (partition_column = 'aaa')
SELECT
column_1
,column_2
,CAST(FROM_UNIXTIME(target_column, 'yyyy-MM-dd HH:mm:ss') AS TIMESTAMP) AS target_column
FROM hogehoge_table
WHERE partition_column = 'aaa'
|