代码之家  ›  专栏  ›  技术社区  ›  mongolol

在ElasticSearch中将Spark DateType字段索引为日期

  •  0
  • mongolol  · 技术社区  · 7 年前

    我正在尝试索引 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)
    

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

    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)
    

    2 回复  |  直到 7 年前
        1
  •  1
  •   tricky    7 年前

    很长一段时间我都没有使用ElasticSearch;但是这个日期类型问题对我来说真的很烦人。

    我要做的是: *在Kibana中或在初始化索引方案时使用curL PUT请求指定CHARTDATE字段的类型为date,如下所示:

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

    我不知道弹性6.4是否改变了什么,如果您能找到更好的解决方案,我将不胜感激,如果您能分享给我们以后!

    我知道这并不是最好的解决方案,必须在运行Spark的saveToEs操作之前放置索引。但那真的是帮我修好它的东西。

    推荐文章