2016-09-29 9 views
0

私はcsvファイルを持っています。それは2つの月と年である多くの列を持っています。月は1 ... 12と表され、2013年は(例)と表されます。私はmm/yyyyの形式でタイムスタンプを新しい列、例えば、 'タイムスタンプ'として作成する必要があります。以下のスニペットを試しましたが失敗しました。sparkでタイムスタンプを作成する際のunix_timestampメソッドの使用

scala> val df = spark.read.format("csv").option("header",  
"true").load("/user/bala/*.csv") 
df: org.apache.spark.sql.DataFrame = [_c0: string, Month: string ... 28  
more fields] 

scala> val df = spark.read.format("csv").option("header", 
"true").load("/user/bala/AWI/*.csv") 
df: org.apache.spark.sql.DataFrame = [_c0: string, Month: string ... 28 
more fields] 

scala> import org.apache.spark.sql.functions.udf 
import org.apache.spark.sql.functions.udf 

scala> def makeDT(Month: String, Year: String) = s"$Month $Year" 
makeDT: (Month: String, Year: String)String 

scala> val makeDt = udf(makeDT(_:String,_:String)) 
makeDt: org.apache.spark.sql.expressions.UserDefinedFunction =  
UserDefinedFunction(<function2>,StringType,Some(List(StringType, 
StringType))) 

scala> df.select($"Month", $"Year", unix_timestamp(makeDt($"Month", 
$"Year"), "mm/yyyy")).show(2) 
    +-----+----+-----------------------------------------+ 
    |Month|Year|unix_timestamp(UDF(Month, Year), mm/yyyy)| 
    +-----+----+-----------------------------------------+ 
    | 1|2013|          null| 
    | 1|2013|          null| 
    +-----+----+-----------------------------------------+ 
    only showing top 2 rows 
scala> 

誰かが私に間違っていると指摘できますか?

答えて

1

タイムスタンプを作成するには、日、月が&年必要です。 あなたのmakeMTを再定義することができます

scala>def makeMT(Month: String, Year: String) = s"00/$Month/$Year 00:00:00" 

その後、あなたは(私はそれをテストdidntは)以下に類似し、それを使用することができます。

(unix_timestamp(makeDt($"Month", $"Year"), "dd/M/yyyy HH:mm:ss") * 1000).cast("timestamp") 
関連する問題