关于使用 Scala 创建 jar 文件时出现 org.apache.spark.sql.AnalysisException 错误

Regarding org.apache.spark.sql.AnalysisException error when creating a jar file using Scala

我有以下简单的 Scala class,稍后我将对其进行修改以适应某些机器学习模型。

我需要从中创建一个 jar 文件,因为我要在 amazon-emr 中 运行 这些模型。我是这个过程的初学者。所以我首先测试了我是否可以成功导入以下 csv 文件并通过使用下面提到的 Scala class 创建一个 jar 文件来写入另一个文件。

csv 文件如下所示,其中包含一个 Date 列作为变量之一。

+-------------------+-------------+-------+---------+-----+
|               Date|      x1     |    y  |      x2 | x3  |       
+-------------------+-------------+-------+---------+-----+
|0010-01-01 00:00:00|0.099636562E8|6405.29|    57.06|21.55|
|0010-03-31 00:00:00|0.016645123E8|5885.41|    53.54|21.89|
|0010-03-30 00:00:00|0.044308936E8|6260.95|57.080002|20.93|
|0010-03-27 00:00:00|0.124928214E8|6698.46|65.540001|23.44|
|0010-03-26 00:00:00|0.570222885E7|6768.49|     61.0|24.65|
|0010-03-25 00:00:00|0.086162414E8|6502.16|63.950001|25.24| 

数据集link:https://drive.google.com/open?id=18E6nf4_lK46kl_zwYJ1CIuBOTPMriGgE

我使用 intelliJ IDEA 从中创建了一个 jar 文件。它成功地完成了。

object jar1 {
  def main(args: Array[String]): Unit = {


      val sc: SparkSession = SparkSession.builder()
        .appName("SparkByExample")
        .getOrCreate()

       val data = sc.read.format("csv")
      .option("header","true")
      .option("inferSchema","true")
      .load(args(0))

    data.write.format("text").save(args(1))

  }

}

之后,我上传了这个 jar 文件以及上面提到的 amazon-s3 中的 csv 文件,并尝试 运行 在 amazon-emr 的集群中。

但它失败了,我收到以下错误消息:

ERROR Client: Application diagnostics message: User class threw exception: org.apache.spark.sql.AnalysisException: Text data source does not support timestamp data type.;

我确定这个错误与数据集中的 Date 变量有关。但我不知道如何解决这个问题。

谁能帮我解决这个问题?

更新:

我试图打开我之前提到的同一个 csv 文件,但没有日期列。在这种情况下,我收到此错误:

ERROR Client: Application diagnostics message: User class threw exception: org.apache.spark.sql.AnalysisException: Text data source does not support double data type.;

谢谢

我后来注意到你要写入一个文本文件。 Spark 的 .format(text) 不支持除 String/Text 之外的任何特定类型。因此,为了实现一个目标,您需要首先将所有类型转换为 String 并存储:

    df.rdd.map(_.toString().replace("[","").replace("]", "")).saveAsTextFile("textfilename")

如果您可以考虑其他选项将数据存储为基于文件的数据,那么您可以享受类型的好处。例如使用 CSV 或 JSON。 这是基于 csv 的 csv 文件的工作代码示例。

val spark = SparkSession.builder
  .appName("Simple Application")
  .config("spark.master", "local")
  .getOrCreate()
import spark.implicits._
import spark.sqlContext.implicits._

val df = spark.read
  .format("csv")
  .option("delimiter", ",")
  .option("header", "true")
  .option("inferSchema", "true")
  .option("dateFormat", "yyyy-MM-dd")
  .load("datat.csv")

df.printSchema()
df.show()

df.write
  .format("csv")
  .option("inferSchema", "true")
  .option("header", "true")
  .option("delimiter", "\t")
  .option("timestampFormat", "yyyy-MM-dd HH:mm:ss")
  .option("escape", "\")
  .save("another")

不需要定制encoder/decoder。