Hadoop技巧(04):簡易處理solr date 時區問題

閱讀目錄

本文版權歸mephisto和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文連接,謝謝合做。html

文章是哥(mephisto)寫的,SourceLinkjava

 

     在cdh集成的solr cloud中,咱們能夠經過solr管理界面進行查詢,也能夠經過java的api進行查詢,但查詢過程當中,若是是時間類型的,可能會存在二者在界面上看上去不一致的問題,二者時間恰好相差本地的時區。git

建立collection

一:上傳配置文件

  爲了模擬現象,咱們設置以下solr文檔結構github

solrctl instancedir --create date_demo /data/solr_s

二:建立collection

solrctl collection --create date_demo -s 2 -m 2 -r 2

建立完後solr的collection以下apache

模擬程序

一:編寫程序

  編寫模擬插入程序。爲了容易查看,只插入2條數據。api

  這裏咱們使用的solr版本爲4.10.3。dom

    private void insert() throws SolrServerException, IOException,
            ParseException {
        String zhHost = "master1/solr";

        CloudSolrServer cloudSolrServer = new CloudSolrServer(zhHost);

        cloudSolrServer.setDefaultCollection("date_demo");

        String id_1 = UUID.randomUUID().toString().replaceAll("-", "")
                .toUpperCase();
        String name_1 = "1點前+8";
        Date createDate_1 = sdfDate.parse("2016-12-30 00:11:12");
        String day_1 = sdfDay.format(createDate_1);

        String id_2 = UUID.randomUUID().toString().replaceAll("-", "")
                .toUpperCase();
        String name_2 = "1點後+8";
        Date createDate_2 = sdfDate.parse("2016-12-30 10:13:14");
        String day_2 = sdfDay.format(createDate_2);

        SolrInputDocument solrInputDocument1 = create(id_1, name_1, day_1,
                createDate_1);
        SolrInputDocument solrInputDocument2 = create(id_2, name_2, day_2,
                createDate_2);

        cloudSolrServer.add(solrInputDocument1);
        cloudSolrServer.add(solrInputDocument2);
        cloudSolrServer.commit();

        System.out.println("success");
    }
View Code

二:運行程序

  能夠看到咱們已經插入2條數據。ide

三:程序查詢

  在程序查詢的結果以下。工具

  能夠看到solr本身的查詢界面使用的時間格式是UTC的,會有時差,咱們這裏是8小時。
CREATEDAY和CREATEDATE有時候不一致。oop

四:處理

  因此爲了3方的統一,要麼本身改solr界面查詢的。要麼本身改下時差,使得3方結果一致,方便使用。

  這裏咱們採用本身修改時差來同步。

  但工具量挺大,得在solr插入的時候轉換下時間格式程utc。還的在每次查詢的時候轉換回來。
因此這裏就本身噁心下本身,改下solr源碼,在源碼中找到對應的位置,固定的修改爲本身這裏的時差。
這樣就間接的使3方同步了。

  找到solr相關的處理代碼類

org.apache.solr.common.util.JavaBinCodec.java

  在readVal下

return new Date(dis.readLong()-28800000l);//由於存儲的時候solr的時間格式是utc的,因此這裏減掉當前時區的值

  在writePrimitive下

daos.writeLong(((Date) val).getTime()+28800000l);//存入的時候爲了同day string同步 加8小時

  這樣就能夠了。

  咱們查看效果。
  爲了對比 將數據的名稱加備註+8

  solr查詢頁面

 

--------------------------------------------------------------------

  到此,本章節的內容講述完畢。

示例下載

Github: https://github.com/sinodzh/HadoopExample/tree/master/2017/solr.demo/

系列索引

  Hadoop技巧系列索引

 

 

 

 

本文版權歸mephisto和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文連接,謝謝合做。

文章是哥(mephisto)寫的,SourceLink

相關文章
相關標籤/搜索