Druid知識點及踩坑總結

1. Druid中的intervals參數

  "spec" : {
    "ioConfig" : {
      "type" : "hadoop",
      "inputSpec" : {
        "type" : "granularity",
        "dataGranularity" : "DAY",
        "inputPath" : "/HDFS路徑",
        "filePattern" : ".*",
        "pathFormat" : "'dt='yyyyMMdd'/id_type=${id_type}'"
      }
    },
    "dataSchema" : {
      "dataSource" : "da_wanxiang_tag_analysis__metric",
      "granularitySpec" : {
        "type" : "uniform",
        "segmentGranularity" : "DAY",
        "queryGranularity" : "DAY",
        "intervals" : ["${sday}T00:00:00.000+08:00/${eday}T00:00:00.000+08:00"]
      },
      "parser" : {
        "type" : "hadoopyString",
        "parseSpec" : {
          "format" : "tsv",
          "delimiter" : "\u0001",
          "timestampSpec" : {
            "format" : "yyyy-MM-dd HH:mm:ss",
            "column" : "dt_time"
          }
        }
      },
    },

GranularitySpec中的intervals參數,指定過濾的時間範圍,有兩個用途:

一是對於ioConfig裏的inputPath下的pathFormat的dt=yyyyMMdd,指定了分區日期,爲${sday}。

二是對於輸入路徑下的所有數據,有一個timeStamp列,這一列存儲了每一行數據對應的時間戳,不符合intervals範圍的時間戳對應的行會被丟棄。

例如:指定了分區日期爲dt=2020-02-16,但是輸入路徑的文件數據中,時間戳列全是2020-01-16,會報錯

報錯信息如下:

上面顯示已經讀取了輸入路徑下的分區數據,但是下面又報錯No buckets? seems there is no data to index

報錯原因在於找不到符合intervals的行

也就是說,intervals指定的dt=2020-02-16這個分區下的文件雖然被讀取到了,但是時間戳列都是2020-01-16,所以沒有符合過濾條件的數據,也即沒有data能夠進入Druid的segment中,所以會報以上錯誤。

2. Druid中的hadoop數據源的粒度

粒度有兩種,查詢粒度queryGranularity和存儲粒度segmentGranularity。

區別是,存儲粒度的粒度更細,比如存儲粒度爲hour,查詢粒度可以是hour和day

但是如果存儲粒度是day,即便查詢粒度是hour,查詢出來的實際粒度還是day。

3. Druid中inputSpec參數

若type指定爲static,爲明確指定輸入路徑,路徑指定到文件夾。

若type指定爲granularity,則需要在輸入路徑目錄中,指定日期格式,如上面所示。

參考文檔:druid上傳數據index文件配置

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章