spark在elasticsearch中写入时间戳

时间:2016-06-28 15:26:12

标签: elasticsearch apache-spark spark-dataframe

我正在从jdbc源读取数据并将其直接写入弹性搜索索引。 当我查询ES中的数据时,我看到我的数据帧中的所有时间戳字段都转换为long

请参阅下面的代码

 val appName="ExractToolEngine"
 val master = "local[2]"
 val conf = new SparkConf().setAppName(appName).setMaster(master)
 conf.set("es.write.operation", "index")
 conf.set("es.mapping.id", "user_id")
 conf.set("index.mapper.dynamic", "true")
 conf.set("es.mapping.rich.date", "true")

  def main(args: Array[String]): Unit = {
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)
    import sqlContext.implicits._

    val srcData = sqlContext.read.format("jdbc").
      options(Map("driver"->"com.jdbc.Driver",
      "url" -> "jdbc...",
      "dbtable"-> "tbl",
      "partitionColumn"-> "user_id",
      "lowerBound"-> "1",
      "upperBound"-> "1000000",
      "numPartitions"-> "50"
      )
).load()
    srcData.filter("user_id>=1 and user_id<=1000000").saveToEs("test_users/sm_1")

}

当我运行srcData.printSchema()

我明白了:

|-- dwh_insert_ts: timestamp (nullable = true)
|-- dwh_update_ts: timestamp (nullable = true)

当我在http://localhost:9200/test_users/_mapping/sm_1

上查询索引映射时

我看到了

"properties": {
"dwh_insert_ts": {
"type": "long"
},
"dwh_update_ts": {
"type": "long"
},

是否需要强制使用elasticsearch来保持时间戳并进行转换?

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我遇到了同样的问题,并且已经解决了。 将时间戳转换为utc格式,例如“ 2020-05-11T14:44:24.000 + 08:00”,这是亚洲/上海时间。然后将其写入es,es会将其映射为日期类型。

答案 2 :(得分:-1)

即使设置了“ es.mapping.rich.date”,“ true”,我仍然面临着问题 我在pyspark上使用Elasticsearch 6.6

df.write.format("org.elasticsearch.spark.sql").option("es.nodes.wan.only","true").option("es.port","9200").option("es.net.ssl","false").option("es.nodes", esURL).option("es.mapping.id", "Tuple_ID").option("es.mapping.rich.date","true").mode("Overwrite").save("readings/sensors")