2016-04-13 29 views
0

我想在使用配置單元的時間戳列中存儲日期和時間戳記值。源文件包含日期或有時間戳的值。如何將日期值存儲在配置單元時間戳中?

有沒有辦法通過在配置單元中使用時間戳數據類型來讀取日期和時間戳。

輸入:

2015-01-01 
2015-10-10 12:00:00.232 
2016-02-01 

輸出,我得到:

null 
    2015-10-10 12:00:00.232 
    null 

是否有可能通過使用時間戳數據類型來讀取兩個值。

DDL:

create external table mytime(id string ,t timestamp) ROW FORMAT DELIMITED 
    FIELDS TERMINATED BY ',' 
STORED AS INPUTFORMAT 
    'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
    'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' 
LOCATION 'hdfs://xxx/data/dev/ind/' 
+1

轉換日期值2015年1月1日至DATETIME像2015 - 01-01 00:00:00.000 –

+0

你的意思是在輸入文件中? –

回答

0

蜂房類似於在數據類型映射方面的任何其他數據庫,因此需要一個均勻的值對於特定列到貼合的數據類型下儲存。您文件中第二列的數據具有不統一的數據,即一些是日期格式,而另一些則是時間戳格式。

爲了不丟失日期,正如@Kishore所建議的那樣,確保文件中有一個統一的數據類型,並獲取文件的時間戳值爲2016-01-01 00:00:000,其中只有日期。

+0

基本上我們正在嘗試通過將日期數據類型更改爲時間戳來使與配置單元表兼容,上述問題是由於配置單元時間戳不支持讀取日期值而造成的。所以最後的結論是修改HDFS中的文件來填充時間值。強化工作來修復歷史文件,但沒有其他選擇。 –

+0

如果有幫助,在下面添加回復。 – SrinivasR

2

我能想到一個解決方法。試着用一小部分數據:

  1. 加載具有不一致的日期數據到一個配置單元表中的數據稱爲table1通過使列作爲字符串數據類型。
  2. 現在使用數據類型創建另一個表格2作爲所需列的時間戳,並使用變換將表格1中的數據加載到表格INSERT OVERWRITE TABLE table2 select id,if(length(tsstr) > 10, tsstr, concat(tsstr,' 00:00:00')) from table1; 這應該以所需格式加載數據。
    代碼如下:

`

create table table1 
(
id int, 
tsstr string 
) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' 
LOCATION '/user/cloudera/hive/table1.tb'; 

Data: 
1,2015-04-15 00:00:00 
2,2015-04-16 00:00:00 
3,2015-04-17 

LOAD DATA LOCAL INPATH '/home/cloudera/data/tsstr' INTO TABLE table1; 


create table table2 
(
id int, 
mytimestamp timestamp 
) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' 
LOCATION '/user/cloudera/hive/table2.tb'; 

INSERT INTO TABLE table2 select id,if(length(tsstr) > 10, tsstr, concat(tsstr,' 00:00:00')) from table1; 



結果顯示爲預期:

enter image description here

+0

謝謝,這是唯一的辦法,但爲了這個工作,我們需要修復歷史數據,數據量是巨大的。爲了使其生產,我們需要重新加載所有數據。 –

+0

是的。這需要重新處理數據和歷史更正 – SrinivasR

相關問題