我尝试读取除了字符串和整数之外还包含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。
有任何建议或是否是错误?
答案 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();
也许这对某人有帮助......