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

sinodzh發表於2017-02-16

閱讀目錄

本文版權歸mephisto和部落格園共有,歡迎轉載,但須保留此段宣告,並給出原文連結,謝謝合作。

文章是哥(mephisto)寫的,SourceLink

 

     在cdh整合的solr cloud中,我們可以通過solr管理介面進行查詢,也可以通過java的api進行查詢,但查詢過程中,如果是時間型別的,可能會存在兩者在介面上看上去不一致的問題,兩者時間剛好相差本地的時區。

建立collection

一:上傳配置檔案

  為了模擬現象,我們設定如下solr文件結構

solrctl instancedir --create date_demo /data/solr_s

二:建立collection

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

建立完後solr的collection如下

模擬程式

一:編寫程式

  編寫模擬插入程式。為了容易檢視,只插入2條資料。

  這裡我們使用的solr版本為4.10.3。

    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條資料。

三:程式查詢

  在程式查詢的結果如下。

  可以看到solr自己的查詢介面使用的時間格式是UTC的,會有時差,我們這裡是8小時。
CREATEDAY和CREATEDATE有時候不一致。

四:處理

  所以為了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

相關文章