如何讀取HDFS上的csv/tsv檔案的Timestamp列 - Qiita

banq發表於2021-12-23

如何讀取放置在 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'



 

相關文章