我正在使用Apache Spark和Apache Kylin,我必须在HDFS中存储一个csv文件,以便能够在Kylin中创建一个立方体。我的想法是将我获得的RDD转换为csv文件,我试图将我的RDD转换为csv文件,如下所示:
bookingDF.write().format("com.databricks.spark.csv").option("header", "true").save("hdfs://10.7.30.131:8020/tmp/hfile/e.csv");
但我总是得到一个很长的错误,我认为这是因为我正在使用的对象的字段Date:
17/01/19 14:50:24 ERROR Utils: Aborting taskscala.MatchError: Fri Dec 09 07:45:27 CET 2016 (of class java.util.Date)
at org.apache.spark.sql.catalyst.CatalystTypeConverters$StructConverter.toCatalystImpl(CatalystTypeConverters.scala:255)
at org.apache.spark.sql.catalyst.CatalystTypeConverters$StructConverter.toCatalystImpl(CatalystTypeConverters.scala:250)
at org.apache.spark.sql.catalyst.CatalystTypeConverters$CatalystTypeConverter.toCatalyst(CatalystTypeConverters.scala:102)...
下面我附上我正在使用的Java对象的代码:
@JsonIgnoreProperties(ignoreUnknown = true)
public class Booking implements Serializable {
private String bPk;
private String type;
private String transactionId;
private Boolean revisit;
private String device;
@JsonProperty("serverTime")
private Date time;
private String trackingId;
private String browserFamily;
@JsonProperty("action")
private String measure;
private String userId;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getMeasure() {
return measure;
}
public void setMeasure(String measure) {
this.measure = measure;
}
public String getBrowserFamily() {
return browserFamily;
}
public void setBrowserFamily(String browserFamily) {
this.browserFamily = browserFamily;
}
public void setTime(Date time) {
this.time = time;
}
public String getTrackingId() {
return trackingId;
}
public void setTrackingId(String trackingId) {
this.trackingId = trackingId;
}
public Date getTime() {
return time;
}
....
我不确定我做错了什么,我试图将java.util.date转换为java.sql.date但我仍然使用java.sql.date获得相同的错误。
答案 0 :(得分:1)
您可以尝试使用java.text.SimpleDateFormat
吗?
来自spark-csv源代码:
dateFormat:
指定一个字符串,指示读取时使用的日期格式 日期或时间戳。
自定义日期格式遵循以下格式java.text.SimpleDateFormat
。
这适用于DateType和 TimestampType。
默认情况下,它为null,表示尝试解析 时间和日期java.sql.Timestamp.valueOf()
和java.sql.Date.valueOf()
。