Scala 从Apache Spark填充Elasticsearch日期
我在Spark中有一个数据帧,其方案如下:Scala 从Apache Spark填充Elasticsearch日期,scala,apache-spark,
elasticsearch,apache-spark-sql,spark-dataframe,Scala,Apache Spark,
elasticsearch,Apache Spark Sql,Spark Dataframe,我在Spark中有一个数据帧,其方案如下: id: string style: string creationdate: string 我的日期是日期时间字符串,如“yyyy-MM-dd HH:MM:ss.SSS”。我正在使用以下命令将“creationdate”从字符串转换为日期: val df2 = df.withColumn("creationdate2", $"creationdate".cast(DateType)) .drop($"creationdate
id: string
style: string
creationdate: string
我的日期是日期时间字符串,如“yyyy-MM-dd HH:MM:ss.SSS”。我正在使用以下命令将“creationdate”从字符串转换为日期:
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)
由于日期已转换为DateType,因此应该能够对其进行分析。有什么想法吗?架构是否应该显示日期类型而不是日期?我转换错误了吗?通过再执行一步并将java.sql.Date转换回字符串来解决。使用自定义项:
val dateToString = udf((date: java.sql.Date) => date.toString)
通过再执行一步并将java.sql.Date转换回字符串来解决此问题。使用自定义项:
val dateToString = udf((date: java.sql.Date) => date.toString)
执行df2.show()时会发生什么?您能在不使用日期转换的情况下保存TOES()吗?@PaulBack show()时一切看起来都很好,日期被修剪为预期的yyyy-MM-dd。saveToEs()在没有cast的情况下抛出相同的错误,并且您修改了ES端的索引以期望字符串类型?@PaulBack一件奇怪的事情是,当我获取随机creationdate并获取其类型java.sql.Date时,ES指南显示它必须是org.apache.spark.sql.types.DateTypeYes类型,它没有问题接受它们为string@PaulBackWhat在执行df2.show()时发生?您能在不使用日期转换的情况下保存TOES()吗?@PaulBack show()时一切看起来都很好,日期被修剪为预期的yyyy-MM-dd。saveToEs()在没有cast的情况下抛出相同的错误,并且您修改了ES端的索引以期望字符串类型?@PaulBack一件奇怪的事情是,当我获取随机creationdate并获取其类型java.sql.Date时,ES指南显示它必须是org.apache.spark.sql.types.DateTypeYes类型,它没有问题接受它们为string@PaulBack