【问题标题】:How do I parse timestamps correctly when using saveToEs to save data from a Spark DataFrame to Elasticsearch?使用 saveToEs 将数据从 Spark DataFrame 保存到 Elasticsearch 时,如何正确解析时间戳?
【发布时间】:2021-03-03 11:44:07
【问题描述】:

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

timestamp_format_A timestamp_format_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,如 docs 中所述,如下所示

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]

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

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

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

【问题讨论】:

    标签: scala apache-spark elasticsearch


    【解决方案1】:

    最后,我决定让我的数据为 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"))
    
    

    这些字段现在已正确解析并存储为日期,但我仍然愿意接受不需要更改源数据格式的替代解决方案。

    【讨论】:

      猜你喜欢
      • 2016-10-31
      • 2023-03-25
      • 1970-01-01
      • 2023-03-15
      • 2023-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多