繁体   English   中英

使用 saveToEs 将数据从 Spark DataFrame 保存到 Elasticsearch 时,如何正确解析时间戳?

[英]How do I parse timestamps correctly when using saveToEs to save data from a Spark DataFrame to Elasticsearch?

在我的 DataFrame 中,我有以下格式的时间戳(存储为字符串):

时间戳格式_A 时间戳格式_B
2021-03-03 11.25.19 2021-03-03 11:25:19

当我通过以下方式将此数据推送到 Elasticsearch 时,这两个字段都被解释并存储为“文本”

myDataFrame.saveToEs("my-index/_doc")

我使用 Elasticsearch 作为单页 web 应用程序的后端,并且需要为我们的最终用户提供查询这些字段作为日期的功能。 当字段存储为“文本”时,用户无法发送查询字符串,例如

timestamp_format_A:>2018

到目前为止,我已经尝试在将数据推送到 Elasticsearch之前将日期映射应用于我的索引,如下文档中所述

PUT my-index
{
  "mappings": {
    "properties": {
      "timestamp_format_A": {
        "type":   "date",
        "format": "yyyy-MM-dd HH.mm.ss"
      },
      "timestamp_format_B": {
        "type":   "date",
        "format": "yyyy-MM-dd HH:mm:ss"
      }
    }
  }
}

但是当我这样做时,我在推送数据时收到一条错误消息:

illegal_argument_exception: mapper [timestamp_format_A] cannot be changed from type [date] to [text]

这有点令人困惑,因为我本以为它会试图做相反的事情。

在以下帖子中推荐上述解决方案:

不确定我是否在这里做错了什么......如何让时间戳正确解析为日期类型?

最后,我决定让我的数据为 Elasticsearch 工作,而不是试图让 Elasticsearch 为我的数据工作。

在我的预处理管道中,我将时间戳字段转换为 Elasticsearch 默认期望的 ISO 8601 格式:

import org.apache.spark.sql.functions.{to_timestamp, date_format}

myDataFrame = myDataFrame.withColumn("timestamp_format_A", date_format(to_timestamp(col("timestamp_format_A"), "yyyy-MM-dd HH.mm.ss"), "yyyy-MM-dd'T'HH:mm:ss"))
myDataFrame = myDataFrame.withColumn("timestamp_format_B", date_format(to_timestamp(col("timestamp_format_B"), "yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd'T'HH:mm:ss"))

这些字段现在已正确解析并存储为日期,但我仍然对不需要更改源数据格式的替代解决方案持开放态度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM