2016-10-06 55 views
1

我應該如何正確使用spark 2.0數據集API解析日期時間?Spark DataSet日期時間解析

有許多用於數據幀的樣本/ RDD像

類等

case class MyClass(myField:java.sql.Datetime) 

val mynewDf = spark.read 
    .option("header", "true") 
    .option("inferSchema", "true") 
    .option("charset", "UTF-8") 
    .option("delimiter", ",") 
    .csv("pathToFile.csv") 
    .as[MyClass] 

不足以施放該類型。 我應該如何正確使用數據集API執行此操作?

編輯

加載數據的作品。例如。一個print schema顯示myDateFiled: timestamp (nullable = true) 但myDf.show導致

java.lang.IllegalArgumentException 
     at java.sql.Date.valueOf(Date.java:143) 

導致我相信,我的日期的分析是不正確的。怎麼會這樣?

+1

對不起,我不清楚你在這裏想要達到的目標以及你的問題是什麼。你能告訴我們一個輸入文件的樣本,並且詳細介紹一下你的問題嗎? – cheseaux

+0

可能應該改爲:如何對數據集執行明確的轉換。 –

+0

@cheseaux請參閱最新編輯中的說明 –

回答

4

時間戳的正確表示是java.sql.Timestamp如此類應定義爲

case class MyClass(myField: java.sql.Timestamp) 

與coressponding數據:

myField 
"2016-01-01 00:00:03" 

如果這個條件滿足所有你需要做的就是提供模式:

spark.read 
    .options(Map("header" -> "true")) 
    .schema(StructType(Seq(StructField("myField", TimestampType, false)))) 
    .csv(...) 
    .as[MyClass] 

有可能提供替代e日期格式,使用dateFormatSimpleDateFormat string

架構定義可以與型鑄造替換.as[MyClass]之前:

spark.read 
    .options(Map("header" -> "true")) 
    .csv(...) 
    .withColumn("myField", $"myField".cast("timestamp")) 
    .as[MyClass] 

對於DateType使用java.sql.Date