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文件配置