【问题标题】:Indexing Spark DateType Fields as Dates in ElasticSearch在 ElasticSearch 中将 Spark DateType 字段索引为日期
【发布时间】:2018-09-10 19:06:19
【问题描述】:

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

 |-- 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。根据我正在使用的连接器的文档(如下所示),Spark 中的DateType 字段应在 ElasticSearch 中写为字符串格式的日期。由于我希望利用日期字段在 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)

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

【问题讨论】:

    标签: apache-spark elasticsearch


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 使用 put 请求为 ES 索引播种日期字段解决了我的问题。感谢您的建议!
    【解决方案2】:

    【讨论】:

    • 感谢您的回复!我尝试投射currentDF.withColumn("CHARTDATE", to_date(col("CHARTDATE"), "yyyy-mm-dd'T'hh:mm:ss.SSSZ")),但遗憾的是遇到了同样的问题。我将在下面结合@tricky 的播种方法来研究这个选角。
    • 另外,要调试 Spark 发送的内容,您可以使用像 Charles 这样的 HTTP 代理,这有助于理解 es4hadoop 的工作原理。随时通知我们!谢谢
    • 最终只需要构建一个为索引播种的方法。时间戳和日期均已正确处理。
    • @mongolol 你能详细说明seeded the index 的意思吗?我也有同样的问题
    • @eugene 我通过df.schema 返回的模式进行递归以构建映射JSON,然后在写入数据之前将其发布到ES。请参阅elastic.co/guide/en/elasticsearch/reference/current/… 了解 ES 的映射 API 和 stackoverflow.com/questions/37471346/…(扁平化模式响应)以通过模式递归。在这种情况下,您正在寻找 DateType 和 TimestampType 的字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多