2015-09-28 96 views
0

我嘗試讀取除了字符串和整數之外還包含Date值的平面文件(csv)。 因此,而不是隻使用長/字符串日期字段將很好,以獲得包含日期值的對象。如何在Spark Java Map函數中使用sql.date與SparkSQL

的代碼,我有如下:

JavaRDD<Date> dates = sc.textFile("hdfs://0.0.0.0:19000/Dates.csv").map(
    new Function<String, Date>(){ 
     @Override 
     public Date call(String line){ 
      String[] fields = line.split(","); 
      return Date.valueOf(fields[2]); 
     } 
}); 

DataFrame schemaTransactions = sqlContext.createDataFrame(dates, Date.class); 
schemaTransactions.registerTempTable("dates"); 
DataFrame dAs = sqlContext.sql("SELECT * FROM dates"); 
Row[] dARows = dAs.collect(); 

代碼編譯但在執行時,該錯誤消息

Exception in thread "main" java.lang.ClassCastException: org.apache.spark.sql.types.DateType$ cannot be cast to org.apache.spark.sql.types.StructType 

拋出這是令人迷惑,因爲文檔賽斯的java。 sql.Date將被支持https://spark.apache.org/docs/latest/sql-programming-guide.html

當我使用sql.Timestamp時會發生同樣的錯誤。

但是,我最初的目標是使用Java8中的LocalDateTime,但由於這不受支持,我嘗試使用sql.Date。

任何建議,或者它是一個錯誤?

回答

0

好吧我只是想通了,如果我們把日期對象放在一個包裝類似乎工作。

下面是代碼: 首先我們定義「包裝」

public class TestClass implements Serializable { 

    Date date; 

    public Date getDate() { 
     return date; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 

} 

,然後更改類型「日期」的包裝類。

JavaRDD<TestClass> dates = sc.textFile("hdfs://0.0.0.0:19000/Dates.csv").map(
new Function<String, TestClass>(){ 
    @Override 
    public TestClass call(String line){ 
     String[] fields = line.split(","); 
     TestClass tc = new TestClass(); 
     tc.setDate(Date.parse(fields[2])); 
     return tc; 
    } 
}); 

DataFrame schemaTransactions = sqlContext.createDataFrame(dates, TestClass.class); 
schemaTransactions.registerTempTable("dates"); 
DataFrame dAs = sqlContext.sql("SELECT * FROM dates"); 
dAs.count(); 

也許這是有人有幫助...

相關問題