gpt4 book ai didi

elasticsearch - 在Elasticsearch Spark中将EPOCH转换为日期

转载 作者:行者123 更新时间:2023-12-02 22:19:27 24 4
gpt4 key购买 nike

我有一个将其写入ES的DataFrame

在写入ES之前,我将EVTExit列转换为EPOCH中的Date。

workset = workset.withColumn("EVTExit", to_date(from_unixtime($"EVTExit".divide(1000))))

workset.select("EVTExit").show(10)

+----------+
| EVTExit|
+----------+
|2014-06-03|
|null |
|2012-10-23|
|2014-06-03|
|2015-11-05|

如我所见,此 EVTExit转换为Date。
workset.write.format("org.elasticsearch.spark.sql").save("workset/workset1")

但是在将其写入ES之后,我仍然可以使用EPOC格式。
"EVTExit" : 1401778800000

任何人都可以知道这里出了什么问题。

谢谢

最佳答案

让我们考虑您的问题中的DataFrame示例:

scala> val df = workset.select("EVTExit")
// df: org.apache.spark.sql.DataFrame = [EVTExit: date]

scala> df.printSchema
// root
// |-- EVTExit: date (nullable = true)

您将需要将该列转换为字符串,并默认禁用 es.mapping.date.richtrue

该参数定义是为Elasticsearch中的Date字段创建类似于日期的富对象还是将其作为原语(字符串或长整数)返回。实际的对象类型基于所使用的库。值得注意的异常是Map / Reduce,它不提供内置的Date对象,因此无论此设置如何,都会返回LongWritable和Text。

我同意,这是违反直觉的,但如果您希望 elasticsearch不将其转换为 long格式,则这是目前唯一的解决方案。这实际上是很痛苦的。
scala> val df2 = df.withColumn("EVTExit_1", $"EVTExit".cast("string"))
// df2: org.apache.spark.sql.DataFrame = [EVTExit: date, EVTExit_1: string]

scala> df2.show
// +----------+----------+
// | EVTExit| EVTExit_1|
// +----------+----------+
// |2014-06-03|2014-06-03|
// | null| null|
// |2012-10-23|2012-10-23|
// |2014-06-03|2014-06-03|
// |2015-11-05|2015-11-05|
// +----------+----------+

现在您可以将数据写入 elasticsearch:
scala> df2.write.format("org.elasticsearch.spark.sql").option("es.mapping.date.rich", "false").save("workset/workset1")

现在,让我们检查一下ES上的内容。首先让我们看一下映射:
$ curl -XGET localhost:9200/workset?pretty=true
{
"workset" : {
"aliases" : { },
"mappings" : {
"workset1" : {
"properties" : {
"EVTExit" : {
"type" : "long"
},
"EVTExit_1" : {
"type" : "date",
"format" : "strict_date_optional_time||epoch_millis"
}
}
}
},
"settings" : {
"index" : {
"creation_date" : "1475063310916",
"number_of_shards" : "5",
"number_of_replicas" : "1",
"uuid" : "i3Rb014sSziCmYm9LyIc5A",
"version" : {
"created" : "2040099"
}
}
},
"warmers" : { }
}
}

看来我们有约会了。现在让我们检查一下内容:
$ curl -XGET localhost:9200/workset/_search?pretty=true -d '{ "size" : 1 }'
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 5,
"max_score" : 1.0,
"hits" : [ {
"_index" : "workset",
"_type" : "workset1",
"_id" : "AVdwn-vFWzMbysX5OjMA",
"_score" : 1.0,
"_source" : {
"EVTExit" : 1401746400000,
"EVTExit_1" : "2014-06-03"
}
} ]
}
}

注1:我保留了两个字段用于演示目的,但我认为您已经明白了。

注2:spark-shell内部进行了Elasticsearch 2.4,Spark 1.6.2,scala 2.10和elasticsearch-spark 2.3.2测试
$ spark-shell --master local[*] --packages org.elasticsearch:elasticsearch-spark_2.10:2.3.2

注3:pyspark相同的解决方案:
from pyspark.sql.functions import col
df2 = df.withColumn("EVTExit_1",col("EVTExit").cast("string"))
df2.write.format("org.elasticsearch.spark.sql") \
.option("es.mapping.date.rich", "false").save("workset/workset1")

关于elasticsearch - 在Elasticsearch Spark中将EPOCH转换为日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39726540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com