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

 

 

 

 

 

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