2015-09-28 55 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(); 

也许这是有人有帮助...

相关问题