Python日期存入elasticsearch的坑


今天在消費kafka數據到elasticsearch(以下簡稱es)中的時候遇到一個問題,也是一個坑,折騰了半天,后來發現得來全不費工夫,全是白忙活啊!!!

問題如下:

kafka數據中有一個字段是時間字符串,格式為:‘2018-05-31 16:33:45:234’

為了方便以后根據日期檢索數據,es里已將該字段設置為date類型,

接下來便開始了str到date轉換的艱辛之路......

嘗試過的解決辦法如下:

1、使用datetime將str轉換為datetime對象

 

    輸出結果如下:

 

    好像成功了,於是開始導入es,但是出錯了

 

    這種轉換對數據的格式要求比較苛刻,一旦原始字符串格式稍有變化,則拋出異常

所以下一步,捕獲異常,將kafka中日期格式不符合要求的數據寫到日志文件中,個別處理

最后:

elasticsearch原生支持date類型,json格式通過字符來表示date類型。所以在用json提交日期至elasticsearch的時候,es會隱式轉換,把es認為是date類型的字符串直接轉為date類型。至於什么樣的字符串es會認為可以轉換成date類型,參考elasticsearch官網介紹https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html。

  date類型是包含時區信息的,如果我們沒有在json代表日期的字符串中顯式指定時區,對es來說沒什么問題,但是如果通過kibana顯示es里的數據時,就會出現問題,數據的時間會晚8個小時。因為kibana從es里讀取的date類型數據,沒有時區信息,kibana會默認當作0時區來解析,但是kibana在通過瀏覽器展示的時候,會通過js獲取當前客戶端機器所在的時區,也就是東八區,所以kibana會把從es得到的日期數據減去8小時。這里就會導致kibana經常遇到的“數據時間延遲8小時”的問題。

  所以最佳實踐方案就是:我們在往es提交日期數據的時候,直接提交帶有時區信息的日期字符串,如:“2016-07-15T12:58:17.136+0800
————————————————
版權聲明:本文為CSDN博主「威震四海」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Beyond_F4/article/details/80528230


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM