druidクエリーインタフェースの使用

26916 ワード

コアdruidクエリーインタフェースの使用
druidのクエリーインタフェースはHTTP RESTスタイルのクエリー方式であり、HTTP RESTスタイルクエリー(Broker,Historical,またはRealtime)ノードのデータを使用し、クエリーパラメータはJSON形式であり、ノードタイプごとに同じRESTクエリーインタフェースが露出する
curl -X POST ':/druid/v2/?pretty' -H 'Content-Type:application/json' -d @<query_json_file>

queryable_host:brokerノードip port:brokerノードポートデフォルト8082
curl -L -H'Content-Type: application/json' -XPOST --data-binary @quickstart/aa.json http://10.20.23.41:8082/druid/v2/?pretty

Queryクエリのタイプは、1、Timeseries 2、TopN 3、Group By 4、Time Boundary 5、Segment Metadata 6、Datasource Metadata 7、Search 8、select
ここで、Timeseries、TopN、GroupByは集約クエリー、Time Boundary、Segment Metadata、Datasource Metadataはメタデータクエリー、Searchは検索クエリー
1、Timeseriesは、一定期間の集計データを統計する必要がある場合、または時間粒度を指定する集計データに対して、druidはTimeseriesによって完了することができる.
timeseriesクエリには、次のフィールドが含まれます.
                                                  
queryType          ,      timeseries        
dataSource                                      
descending                                          
intervals           ,   ISO-8601            
granularity                             
filter                                          
aggregations                                           
postAggregations                                     
context                                          

timeseriesは、時間粒度ごとに条件を指定する統計情報を出力し、filterによって条件フィルタを指定し、aggregationsとpostAggregationsによって集約方法を指定します.timeseriesは次元情報を出力できません.granularityはall,none,second,minute,hour,day,week,month,yearなどの次元をサポートします.
all:出力を1つまとめるnone:使用を推奨しません
その他:該当する粒度統計を出力
クエリのjson
{
  "aggregations": [
    {
      "type": "count", 
      "name": "count"
    }
  ], 
  "intervals": "1917-08-25T08:35:20+00:00/2017-08-25T08:35:20+00:00", 
  "dataSource": "app_auto_prem_qd_pp3", 
  "granularity": "all", 
  "postAggregations": [], 
  "queryType": "timeseries"
}
sql select count(1) from app_auto_prem_qd_pp3に等しい
TopNは、指定する次元と並べ替えフィールドの順序top-nシーケンスを返す.TopNは、前のNレコードを返すことをサポートし、指定されたMetricをソート基準としてサポートします.
{
  "metric": "sum__total_standard_premium", 
  "aggregations": [
    {
      "type": "doubleSum", 
      "fieldName": "total_standard_premium", 
      "name": "sum__total_standard_premium"
    }
  ], 
  "dimension": "is_new_car", 
  "intervals": "1917-08-29T20:05:10+00:00/2017-08-29T20:05:10+00:00", 
  "dataSource": "app_auto_prem_qd_pp3", 
  "granularity": "all", 
  "threshold": 50000, 
  "postAggregations": [], 
  "queryType": "topN"
}
                                                  
queryType       TopNTopN               
dataSource                                        
intervals           ,   ISO-8601              
filter                                            
aggregations                                     
postAggregations                                 
dimension     TopNTopN            
threshold          TopN  N                          
metric                       metric              
context                                          

Metric:TopN専用方式です.
"metric":""           

"metric" : {
    "type" : "numeric", //    numeric     
    "metric" : ""
}

"metric" : {
    "type" : "inverted", //    numeric     
    "metric" : ""
}

"metric" : {
    "type" : "lexicographic", //         
    "metric" : ""
}

"metric" : {
    "type" : "alphaNumeric", //        
    "metric" : ""
}

なお,TopNは近似アルゴリズムであり,各segmentが上位1000個を返して集計して最終的な結果を得るが,dimensionの基数が1000以内であれば正確であり,1000を超えると近似値である.
groupBy groupByはSQLのgroupby操作と似ており、指定した複数の次元をグループ化したり、指定した次元をソートしたり、limit行数を出力したりすることができ、having操作をサポートします.
{
  "dimensions": [
    "is_new_car", 
    "status"
  ], 
  "aggregations": [
    {
      "type": "doubleSum", 
      "fieldName": "total_standard_premium", 
      "name": "sum__total_standard_premium"
    }
  ], 
  "having": {
    "type": "greaterThan", 
    "aggregation": "sum__total_standard_premium", 
    "value": "484000"
  }, 
  "intervals": "1917-08-29T20:26:52+00:00/2017-08-29T20:26:52+00:00", 
  "limitSpec": {
    "limit": 2, 
    "type": "default", 
    "columns": [
      {
        "direction": "descending", 
        "dimension": "sum__total_standard_premium"
      }
    ]
  }, 
  "granularity": "all", 
  "postAggregations": [], 
  "queryType": "groupBy", 
  "dataSource": "app_auto_prem_qd_pp3"
}

sql select is_new_car,status,sum(total_standard_premium) from app_auto_prem_qd_pp3 group by is_new_car,status limit 50000 having sum(total_standard_premium)>484000に等しい
{
  "version" : "v1",
  "timestamp" : "1917-08-30T04:26:52.000+08:00",
  "event" : {
    "sum__total_standard_premium" : 8.726074368E9,
    "is_new_car" : " ",
    "status" : null
  }
}, {
  "version" : "v1",
  "timestamp" : "1917-08-30T04:26:52.000+08:00",
  "event" : {
    "sum__total_standard_premium" : 615152.0,
    "is_new_car" : " ",
    "status" : null
  }
  }
                                                  
queryType        GroupByGroupBy      
dataSource                                       
dimensions        GroupBy                       
limitSpec                                        
having                                           
granularity                                    
postAggregations                                    
intervals               ,   ISO-8601           
context                                          

GroupBy固有のフィールドはlimitSpecとhavingです
LimitSpecソートルールとlimitの行数を指定
{
    "type" : "default",
    "limit":,
    "columns":[list of OrderByColumnSpec]
}

ここでcolumnsは配列であり、複数のソートフィールドを指定できます.ソートフィールドはdemensionまたはmetricにソートルールのスペルを指定できます.
{
    "dimension" :"",  
    "direction" : <"ascending"|"descending">
}

 "limitSpec": {
    "limit": 2, 
    "type": "default", 
    "columns": [
      {
        "direction": "descending", 
        "dimension": "sum__total_standard_premium"
      },
     {
        "direction": "ascending", 
        "dimension": "is_new_car"
      } 
    ]
  }

havingはSQLのhaving操作に似ています
select
selectはsqlのselect操作と似ています.selectはdruidに格納されているデータを表示し、指定されたフィルタと時間帯に従って指定された次元とmetricを表示することをサポートします.descendingフィールドでソート順を指定し、ページングをサポートしますが、aggregationsとpostAggregations jsonの例は次のとおりです.
{
  "dimensions": [
      "status",
      "is_new_car"
  ], 
  "pagingSpec":{
  "pagingIdentifiers":{},
  "threshold":3
  },
  "intervals": "1917-08-25T08:35:20+00:00/2017-08-25T08:35:20+00:00", 
  "dataSource": "app_auto_prem_qd_pp3", 
  "granularity": "all", 
  "context" : {
   "skipEmptyBuckets" : "true"
  },
  "queryType": "select"
}

SQL文select status,is_new_car from app_auto_prem_qd_pp3 limit 3に相当
[ {
  "timestamp" : "2017-08-22T14:00:00.000Z",
  "result" : {
    "pagingIdentifiers" : {
      "app_auto_prem_qd_pp3_2017-08-22T08:00:00.000+08:00_2017-08-23T08:00:00.000+08:00_2017-08-22T18:11:01.983+08:00" : 2
    },
    "dimensions" : [ "is_new_car", "status" ],
    "metrics" : [ "total_actual_premium", "count", "total_standard_premium" ],
    "events" : [ {
      "segmentId" : "app_auto_prem_qd_pp3_2017-08-22T08:00:00.000+08:00_2017-08-23T08:00:00.000+08:00_2017-08-22T18:11:01.983+08:00",
      "offset" : 0,
      "event" : {
        "timestamp" : "2017-08-22T22:00:00.000+08:00",
        "status" : null,
        "is_new_car" : " ",
        "total_actual_premium" : 1012.5399780273438,
        "count" : 1,
        "total_standard_premium" : 1250.050048828125
      }
    }, {
      "segmentId" : "app_auto_prem_qd_pp3_2017-08-22T08:00:00.000+08:00_2017-08-23T08:00:00.000+08:00_2017-08-22T18:11:01.983+08:00",
      "offset" : 1,
      "event" : {
        "timestamp" : "2017-08-22T22:00:00.000+08:00",
        "status" : null,
        "is_new_car" : " ",
        "total_actual_premium" : 708.780029296875,
        "count" : 1,
        "total_standard_premium" : 1250.050048828125
      }
    }, {
      "segmentId" : "app_auto_prem_qd_pp3_2017-08-22T08:00:00.000+08:00_2017-08-23T08:00:00.000+08:00_2017-08-22T18:11:01.983+08:00",
      "offset" : 2,
      "event" : {
        "timestamp" : "2017-08-22T22:00:00.000+08:00",
        "status" : null,
        "is_new_car" : " ",
        "total_actual_premium" : 1165.489990234375,
        "count" : 1,
        "total_standard_premium" : 1692.800048828125
      }
    } ]
  }
} ]

pagingSpecでページングプルのoffsetとエントリ数を指定し、結果として次のプルのoffsetを返します.
 "pagingSpec":{
  "pagingIdentifiers":{},
  "threshold":3,
  "fromNext" :true
  }

Search
searchクエリは、SQLのtopN操作と同様に、マッチング内の次元を返しますが、jsonの例では、より多くのマッチング操作をサポートします.
{
  "queryType": "search",
  "dataSource": "app_auto_prem_qd_pp3",
  "granularity": "all",
  "limit": 2,
  "searchDimensions": [
    "data_source",
    "department_code"
  ],
  "query": {
    "type": "insensitive_contains",
    "value": "1"
  },
  "sort" : {
    "type": "lexicographic"
  },
  "intervals": [
    "1917-08-25T08:35:20+00:00/2017-08-25T08:35:20+00:00"
  ]
} 

検索次元
                                                  
queryType           search  ,      search     
dataSource                                      
searchDimensions       search                     
limit                                      (  1000)
granularity                                
intervals                  ,   ISO-8601      
sort                                             
query                                              
context                                          
filter                                             

なお、searchはマッチング中の次元を返すだけで、他の集約操作はサポートされていません.searchをクエリー条件としてtopN、groupBy、timeseriesなどの操作を行う場合は、filterフィールドに様々なフィルタ方法を指定できます.filterフィールドも正規マッチングをサポートします.クエリーの結果は次のとおりです.
[ {
  "timestamp" : "2017-08-22T08:00:00.000+08:00",
  "result" : [ {
    "dimension" : "data_source",
    "value" : "226931204023",
    "count" : 2
  }, {
    "dimension" : "data_source",
    "value" : "226931204055",
    "count" : 7
  } ]
} ]

クエリーの選択
1、可能な場合、GroupByではなくTimeseriesとTopNクエリーを使用することをお勧めします.GroupByは最も柔軟なクエリーであり、最悪の表現です.次元のグループ化を必要としない集約の場合、TimeseriesはGroupByクエリよりも速く、単一次元のグループ化とソートの場合、TopNクエリはGroupByよりも最適化されます.