我正在尝试使用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中建立一些可视化对象时,由于久而久之,事实证明它们的编写是有问题的。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问题对我来说真的很烦。
我正在做的这项工作是:
*在Spark中将DateType转换为纪元时间戳(不确定此处是否必要)
*在初始化索引方案时,在Kibana中指定或使用curL PUT请求进行指定,以使字段CHARTDATE的日期类型如下所示:
PUT /spark
{
"mappings": {
"log": {
"properties": {
"CHARTDATE": {
"type": "date"
}
}
}
}
}
我不知道Elastic 6.4是否更改了任何内容,如果您找到了更好的解决方案,请稍后与我们分享!
我知道这并不是最好的解决方案,必须在运行Spark的saveToEs操作之前先输入索引。但这确实是为我解决的问题。
关于apache-spark - 在ElasticSearch中将Spark DateType字段索引为日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52253025/