2016-06-27 5 views
0

データ型DATEの列にはsparkSQL などがあります。
CREATE TABLE ABC(startDate DATE, EndDate DATE....
と私はUSER.TXTデータで
LOAD DATA INPATH './input/user.txt' INTO TABLE ABC
sparkSQLの '/'区切りの生データから日付の列を入力

としてデータをロードするには、

2016/06/12 2016/06/15 
2016/06/12 2016/06/15 

のようですが、それは

だかどうかは

null null 
null null 

としてデータをロードします

2016-06-12 2016-06-15 
2016-06-12 2016-06-15 

データを正しく取得します。
日付区切り記号が '/'のときのデータの扱い方は?
入力ファイルの区切り文字を置き換えたくありません。
私を助けてください。ありがとう。

+0

にSparkSQLの関数を使用してそれを行うためのもう一つの方法を見つけました。 –

+0

開始日と終了日のフィールドに日付時刻関数を使用する予定ですか? – dheee

+0

@vkp他のテーブルにCAST(startDate as DATE)を使ってデータを挿入しようとしましたが、それでもヌル値を入れました。 – Dhananjay

答えて

2

ハイブでこの問題に直面しました。私はこれを回避する方法を見つけました。それから私は、フィールド上から日付/月/年を抽出するために、文字列関数を使用

CREATE TABLE ABC(startDate string, EndDate string....) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ']' 
STORED AS TEXTFILE 
LOCATION './input/user.txt'; 

:最初の代わりに、データ型DATEの文字列として

元をロードします。例えば

select substr(date,1,4) as year,substr(date,6,1) as month .... from ABC 

一つの他の方法は、との「/」を交換することである「 - 」当時とDATEタイプと使用日付関数としてそれらを投げ

select regexp_replace(startDate,'/','-') from ABC 

上記のすべてでありますHiveでそれを達成する方法。これをsparkで処理するには、最初に文字列としてデータフレームにロードすることです。

val s1 = Seq(("2016/06/12", "2016/06/15"), ("2016/06/12", "2016/06/15")).toDF("x", "y") 
val result = s1.select(regexp_replace($"x","/", "-"),regexp_replace($"y","/", "-")).show() 

result 
+----------+----------+ 
| startDate| EndDate| 
+----------+----------+ 
|2016-06-12|2016-06-15| 
|2016-06-12|2016-06-15| 
+----------+----------+ 

希望します。

+0

データ処理中のセパレータの置き換えは完全に機能します。ありがとう@Dheee – Dhananjay

0

私は私はあなたがロードスクリプトに(日付などの文字列をキャストする)日付変換関数を使用すべきだと思うスパーク2.0のプレビューバージョン

TO_DATE(from_unixtime(unix_timestamp(regexp_replace(startDate , '/','-'),'MM-dd-yyyy'))) AS startDate 
関連する問題