【问题标题】:How to use sql.Date in Spark Java Map Function with for SparkSQL如何将 sql.Date 在 Spark Java 映射函数中与 SparkSQL 一起使用
【发布时间】:2015-09-28 07:15:23
【问题描述】:

我尝试读取除了字符串和整数之外还包含日期值的平面文件 (csv)。 因此,除了对 Date 字段使用 long/String 之外,还可以很好地获取包含 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 to be supported https://spark.apache.org/docs/latest/sql-programming-guide.html

当我使用 sql.Timestamp 时出现同样的错误。

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

有什么建议还是有问题?

【问题讨论】:

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


    【解决方案1】:

    好的,我刚刚发现如果我们将 Date 对象放在 Wrapper 类中,它似乎可以工作。

    代码如下: 首先我们定义我们的“包装器”

    public class TestClass implements Serializable {
    
        Date date;
    
        public Date getDate() {
            return date;
        }
    
        public void setDate(Date date) {
            this.date = date;
        }
    
    }
    

    然后将Type“Date”改为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();
    

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

    【讨论】:

      猜你喜欢
      • 2015-01-05
      • 1970-01-01
      • 2016-01-18
      • 2015-06-29
      • 2018-12-03
      • 2019-06-08
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多