apache-spark - 在 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 日期的步骤?
解决方案
很久没有使用 ElasticSearch 了;但是这个 DateType 问题对我来说真的很烦人。
我为完成这项工作所做的是: * 将 DateType 转换为 Spark 中的纪元时间戳(不确定此处是否有必要步骤) * 当我初始化字段 CHARTDATE 的索引方案时,在 Kibana 或使用 curL PUT 请求中指定像这样输入日期:
PUT /spark
{
"mappings": {
"log": {
"properties": {
"CHARTDATE": {
"type": "date"
}
}
}
}
}
我不知道 Elastic 6.4 是否改变了任何东西,如果您找到更好的解决方案,如果您稍后可以分享给我们,我将不胜感激!
我知道这并不是最好的解决方案,在从 Spark 运行 saveToEs 操作之前必须 PUT 索引。但这确实是为我解决问题的事情。
推荐阅读
- angular - 基于垫选项卡单击垫展开折叠应显示
- amazon-ec2 - 无法从 RhinoSecurityLabs 克隆 CloudGoat
- c - 带有一个参数的 zsh export 似乎并没有真正创建环境变量
- codeigniter - 如何将 Mailgun 变量添加到模板中?
- python-3.x - 在 pygame 中发现了一个奇怪的 hitbox 错误。如果玩家在我的游戏中死亡,hitbox 仍然存在,这会产生一些问题
- swiftui - 如何在 SwiftUI 中的视图中调用方法
- excel - excel公式本地化
- javascript - 如何在将 .ticks() 应用于我的 x 刻度时解决 d3 js 中的此错误
- linux - 如何帮助可执行文件找到共享库?
- git - 不小心将一个大文件提交到本地 git。现在我必须删除它才能推送到远程