(Scala) 在 Apache Spark 中将字符串转换为日期

M-T*_*ier 4 sql csv scala apache-spark

我想用 Spark 读取 .csv 文件并将列与拟合类型相关联。

    val conf = new SparkConf()
        .setMaster("local[8]")
        .setAppName("Name")

    val sc = new SparkContext(conf)

    val sqlContext = new SQLContext(sc)

    val customSchema = StructType(Array(
        StructField("date", DateType, true),
        StructField("time",StringType, true),
        StructField("am", DoubleType, true),
        StructField("hum", DoubleType, true),
        StructField("temp", DoubleType, true)
    ))

    val df = sqlContext.read
            .format("org.apache.spark.sql.execution.datasources.csv.CSVFileFormat")
            .option("header","true")
            .option("delimiter",";")
            .schema(customSchema)
            .load("data.csv")
Run Code Online (Sandbox Code Playgroud)

我正在阅读的一行 .csv 看起来像这样

+----------+--------+-----+-----+-----+
|      date|    time|   am|  hum| temp|
+----------+--------+-----+-----+-----+
|04.10.2016|12:51:20|1.121|0.149|0.462|
+----------+--------+-----+-----+-----+
Run Code Online (Sandbox Code Playgroud)

如果我将日期的类型设置为字符串,Spark 将读取 .csv 并正确关联类型。如果我像上面显示的代码一样保留 customSchema,由于日期格式错误,Spark 将抛出异常(DateType will expect YYYY-MM-DD while mine is DD.MM.YYYY).

有没有办法将日期字符串重新格式化为 YYYY-MM-DD 并在之后应用架构?或者我也可以通过添加参数来改变 Spark 给出的 DateType ?

提前致谢

小智 5

使用dateFormat选项:

val df = sqlContext.read
  .format("org.apache.spark.sql.execution.datasources.csv.CSVFileFormat")
  .option("header","true")
  .option("delimiter",";")
  .option("dateFormat", "dd.MM.yyyy")
  .schema(customSchema)
  .load("data.csv")
Run Code Online (Sandbox Code Playgroud)