如何在Spark Java Map函数中使用sql.Date和SparkSQL

时间:2015-09-28 07:15:24

标签: java apache-spark apache-spark-sql

我尝试读取除了字符串和整数之外还包含Date值的平面文件(csv)。 因此,不仅仅使用long / String作为Date字段,最好得到一个包含Date值的对象。

我的代码如下:

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

被抛出令人困惑,因为文档sais java.sql.Date受支持https://spark.apache.org/docs/latest/sql-programming-guide.html

使用sql.Timestamp时会发生同样的错误。

但是,我最初的目标是使用Java8中的LocalDateTime,但由于不支持,我尝试使用sql.Date。

有任何建议或是否是错误?

1 个答案:

答案 0 :(得分:0)

好的,我只是想知道如果我们将Date对象放在Wrapper类中,它似乎工作。

这是代码: 首先,我们定义我们的&#34; Wrapper&#34;

public class TestClass implements Serializable {

    Date date;

    public Date getDate() {
        return date;
    }

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

}

然后更改Type&#34; Date&#34;到Wrapper课程。

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();

也许这对某人有帮助......