如何读取HDFS上的csv/tsv文件的Timestamp列 - Qiita

21-12-23 banq

如何读取放置在 HDFS 上的 csv/tsv 文件的时间戳列,当一个包含 Timestamp 类型字符串列的 csv/tsv 文件被放置在 HDFS 上,读入一个表,然后需要将该列插入另一个表的过程。我想知道 csv / tsv 文件的 Timestamp 类型字符串是否可以像 Hive 的 Timestamp 类型一样读取?
 
发现:
  • 如果您使用的是 Hive 1.2.0 或更高版本,请按照https://issues.apache.org/jira/browse/HIVE-9298 中所述格式化每个表的时间戳。
  • 在此之前,为了将包含 Timestamp 类型字符串列的 csv/tsv 文件读取为外部表,最好将其转换为 unixtime 并输出。并且当插入到另一个表中时,它会通过 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'