填充 Elasticsearch 的日期来自 Apache Spark



我在Spark中有一个数据帧,其方案如下:

id: string
style: string
creationdate: string

我的日期是日期时间字符串,例如"yyyy-MM-dd HH:mm:ss。SSS"。我正在使用以下命令将"创建日期"从字符串转换为日期:

val df2 = df.withColumn("creationdate2", $"creationdate".cast(DateType))
             .drop($"creationdate")
             .withColumnRenamed("creationdate2", "creationdate")

这导致:

id: string
style: string
creationdate: date

我正在尝试使用定义为以下日期映射的 Elasticsearch 索引填充

     "creationdate": {
        "type": "date",
        "format": "yyyy-MM-dd"
      }

字符串到日期时间的转换在打印时似乎与此格式匹配。 但是,当我用以下内容填充索引时:

df2.saveToEs("myindex")  

我收到一个错误:

 org.apache.spark.util.TaskCompletionListenerException: Found unrecoverable error [169.10.29.240:9200] returned Bad Request(400) - failed to parse [creationdate]; Bailing out..
        at org.apache.spark.TaskContextImpl.markTaskCompleted(TaskContextImpl.scala:105)
        at org.apache.spark.scheduler.Task.run(Task.scala:112)
        at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:282)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

根据指南,日期应该能够被解析,因为它已被转换为日期类型。 有什么想法吗? 架构是否应该显示日期类型而不是日期? 我转换错了吗?

通过再执行一个步骤并将java.sql.date转换回字符串来解决。 使用 UDF:

val dateToString = udf((date: java.sql.Date) => date.toString)

最新更新