Apache spark 将Spark DateType字段索引为ElasticSearch中的日期
我正在尝试使用ElasticSearch hadoop连接器在ElasticSearch中为下面模式的数据帧编制索引Apache spark 将Spark DateType字段索引为ElasticSearch中的日期,apache-spark,
elasticsearch,Apache Spark,
elasticsearch,我正在尝试使用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 = fa
|-- 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”字段被写入为长字段。根据我正在使用的连接器文档(如下所示),Spark中的DateType
字段应在ElasticSearch中以字符串格式的日期写入。当我希望利用日期字段在Kibana中构建一些可视化时,将它们写成long被证明是有问题的
用于产生错误的代码
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;但是这个日期类型的问题对我来说真的很烦人 我所做的工作是: *在Spark中将日期类型转换为历元时间戳(此处不确定是否需要此步骤) *在Kibana中或在我初始化索引方案时使用curL-PUT请求指定字段CHARTDATE的日期类型如下:
PUT /spark
{
"mappings": {
"log": {
"properties": {
"CHARTDATE": {
"type": "date"
}
}
}
}
}
我不知道Elastic 6.4是否改变了什么,如果您能找到更好的解决方案,请稍后与我们分享,我将不胜感激
我知道这并不是最好的解决方案,必须在运行Spark的saveToEs操作之前放置索引。但这确实是我解决问题的方法。很长时间我都没有使用ElasticSearch;但是这个日期类型的问题对我来说真的很烦人 我所做的工作是: *在Spark中将日期类型转换为历元时间戳(此处不确定是否需要此步骤) *在Kibana中或在我初始化索引方案时使用curL-PUT请求指定字段CHARTDATE的日期类型如下:
PUT /spark
{
"mappings": {
"log": {
"properties": {
"CHARTDATE": {
"type": "date"
}
}
}
}
}
我不知道Elastic 6.4是否改变了什么,如果您能找到更好的解决方案,请稍后与我们分享,我将不胜感激
我知道这并不是最好的解决方案,必须在运行Spark的saveToEs操作之前放置索引。但这确实是我修复它的原因。根据文档:
您必须使用格式。根据文档:
您必须使用格式。谢谢您的回复!我试着用column(“CHARTDATE”)、to_date(col(“CHARTDATE”)、“yyyy-mm-dd'T:hh:mm:ss.SSSZ”)来转换currentDF.,不幸地得到了同样的问题。我将结合下面的@tricky的种子方法来研究这个强制转换。另外,要调试Spark发送的内容,可以使用Charles这样的HTTP代理,这有助于理解es4hadoop的工作原理。随时通知我们!Thankssend只需要建立一个方法来播种索引。时间戳和日期都被正确处理。@你能详细解释一下你所说的在索引中添加
种子是什么意思吗?我也吃同样的problem@eugene我递归通过df.schema
返回的模式来构建一个JSON映射,然后在写入数据之前将其发布到ES。有关ES的映射API,请参阅;有关通过模式递归的信息,请参阅(扁平模式响应)。在本例中,您正在查找DateType
和TimestampType
字段。感谢您的回复!我试着用column(“CHARTDATE”)、to_date(col(“CHARTDATE”)、“yyyy-mm-dd'T:hh:mm:ss.SSSZ”)来转换currentDF.
,不幸地得到了同样的问题。我将结合下面的@tricky的种子方法来研究这个强制转换。另外,要调试Spark发送的内容,可以使用Charles这样的HTTP代理,这有助于理解es4hadoop的工作原理。随时通知我们!Thankssend只需要建立一个方法来播种索引。时间戳和日期都被正确处理。@你能详细解释一下你所说的在索引中添加种子是什么意思吗?我也吃同样的problem@eugene我递归通过df.schema
返回的模式来构建一个JSON映射,然后在写入数据之前将其发布到ES。有关ES的映射API,请参阅;有关通过模式递归的信息,请参阅(扁平模式响应)。在本例中,您正在查找DateType
和TimestampType
字段。使用put请求为ES索引添加日期字段种子解决了我的问题。谢谢你的建议!使用put请求在ES索引中添加日期字段,解决了我的问题。谢谢你的建议!