首页 > 解决方案 > 在 ElasticSearch 中将 Spark DateType 字段索引为日期

问题描述

我正在尝试DataFrame使用 elasticsearch-hadoop 连接器在 ElasticSearch 中索引以下架构。

 |-- ROW_ID: long (nullable = false)
 |-- SUBJECT_ID: long (nullable = false)
 |-- HADM_ID: long (nullable = true)
 |-- CHARTDATE: date (nullable = false)
 |-- CATEGORY: string (nullable = false)
 |-- DESCRIPTION: string (nullable = false)
 |-- CGID: integer (nullable = true)
 |-- ISERROR: integer (nullable = true)
 |-- TEXT: string (nullable = true)

将此 DataFrame 写入 ElasticSearch 时,“CHARTDATE”字段被写入为 long。根据我正在使用的连接器的文档(如下所示)DateType,Spark 中的字段应在 ElasticSearch 中写为字符串格式的日期。由于我希望利用日期字段在 Kibana 中构建一些可视化,因此将它们写成 longs 被证明是有问题的。

https://www.elastic.co/guide/en/elasticsearch/hadoop/6.4/spark.html

用于产生错误的代码

val elasticOptions = Map(
      "es.nodes"              -> esIP,
      "es.port"               -> esPort,
      "es.mapping.id"         -> primaryKey,
      "es.index.auto.create"  -> "yes",
      "es.nodes.wan.only"     -> "true",
      "es.write.operation"    -> "upsert",
      "es.net.http.auth.user" -> esUser,
      "es.net.http.auth.pass" -> esPassword,
      "es.spark.dataframe.write.null" -> "true",
      "es.mapping.date.rich" -> "true"
    )
castedDF.saveToEs(index, elasticOptions)

我是否缺少将这些值写为 ES 日期的步骤?

标签: apache-sparkelasticsearch

解决方案


很久没有使用 ElasticSearch 了;但是这个 DateType 问题对我来说真的很烦人。

我为完成这项工作所做的是: * 将 DateType 转换为 Spark 中的纪元时间戳(不确定此处是否有必要步骤) * 当我初始化字段 CHARTDATE 的索引方案时,在 Kibana 或使用 curL PUT 请求中指定像这样输入日期:

PUT /spark
{
 "mappings": {
  "log": {
    "properties": {
      "CHARTDATE": {
        "type": "date"
      }
    }
  }
 }
} 

我不知道 Elastic 6.4 是否改变了任何东西,如果您找到更好的解决方案,如果您稍后可以分享给我们,我将不胜感激!

我知道这并不是最好的解决方案,在从 Spark 运行 saveToEs 操作之前必须 PUT 索引。但这确实是为我解决问题的事情。


推荐阅读