【问题标题】:RDD to CSV JAVARDD 转 CSV JAVA
【发布时间】:2017-06-04 07:54:22
【问题描述】:

我正在使用 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");

但我总是收到这样的错误,我认为这是因为我正在使用的对象的字段日期:

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。

【问题讨论】:

  • 我不得不问一个显而易见的问题,它想要什么日期对象类型?
  • 我意识到它不接受 java.date.util,因此我使用了时间戳,现在它正在工作。你能解释一下你是怎么知道的吗?我的意思是因为线路错误??我正在学习,因此我无法看到它需要哪种日期对象类型。
  • 是的,我从线路错误中知道。它说它不匹配,这意味着它正在寻找特定的东西。

标签: java csv hadoop apache-spark


【解决方案1】:

您可以尝试使用java.text.SimpleDateFormat 吗?

来自spark-csv源代码:

日期格式:

指定一个字符串,指示读取时使用的日期格式 日期或时间戳。
自定义日期格式遵循以下格式 java.text.SimpleDateFormat.
这适用于 DateType 和 TimestampType.
默认为null,表示尝试解析 时间和日期由java.sql.Timestamp.valueOf()java.sql.Date.valueOf().

【讨论】:

  • 谢谢@Yaron,我不知道它不接受java.date.util,我正在研究你的答案,我使用了时间戳,现在它正在工作。现在我' m 获得其他错误,但我认为与 hdfs 节点有关。我将在其他帖子中写它,我正在学习因此总是欢迎实验同事的任何帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
相关资源
最近更新 更多