当前位置: 首页 > 面试题库 >

在Elasticsearch Spark中将EPOCH转换为日期

暴才俊
2023-03-14
问题内容

我有一个将其写入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已转换为日期。

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.rich这是true默认。

该参数定义是为Elasticsearch中的Date字段创建类似Rich
Date的对象还是将其作为原语(字符串或long)返回。实际的对象类型基于所使用的库。值得注意的 异常是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|
// +----------+----------+

现在您可以将html" target="_blank">数据写入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:在内部 对Elasticsearch 2.4,Spark 1.6.2,scala 2.10和elasticsearch-spark
2.3.2进行了测试spark-shell

$ 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")


 类似资料:
  • 我有一个json数据文件,其中包含一个属性[creationDate],它是“长”数字类型的unix epoc。Apache Spark DataFrame模式如下所示: 我想做一些groupBy“creationdata_year”,这些groupBy需要从“creationdate”获得。 使用Java在DataFrame中进行这种转换的最简单方法是什么?

  • 问题内容: 是否有一个内置的转换方法为在Python,例如获得在指定日期的午夜?相反的转换很容易:有一个方法。 我真的必须手动打电话吗? 问题答案: 您可以使用;现在,您创建一个初始化为午夜的对象。

  • 我试图检查JWT令牌的到期日,我所做的一切都没有给我正确的日期。 我试过那些libs,但没有成功... https://github.com/auth0/angular2-jwt/blob/master/src/jwthelper.service.ts 以下是完整的令牌: https://jwt.io/正在解码令牌,并且显示的exp正确。 如何从token获取真实日期。经验?

  • 在Swift中,我使用kCFStringTransformToLatin将日语转换为Romaji,将汉语转换为拼音。在Java中有什么可以与Android相媲美的吗?或者我必须导入一些库(正如在这里的几篇文章中讨论的那样)。如果是,建议哪一个?

  • 问题内容: 我需要转换为搜索的内容,但找不到任何内容。那你可以帮我解决这个问题吗? 编辑: 我在GWT屏幕上执行此转换过程。我在屏幕上,使用它的方法可以给我带来价值。因此,我应该将此值放入具有Date类型的对象的属性中。 希望我的编辑会更加清晰。 编辑2: 这行是我的问题的解决方案: 问题答案: 日期转换的最佳方法是使用以毫秒为单位的时间(UTC)。JS Date对象和java.util.Date

  • 问题内容: 我在mySQL 5.1中有一个数据类型的日期列。如何将其转换为DATE? 这是我到目前为止所拥有的- 得到这个 错误-#1064-您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册以获取正确的语法,以在’FROM 7 FOR 4附近使用) 请帮忙。 问题答案: 您可以使用MySQL的功能 尽管我怀疑您使用Unix时间戳会更轻松