blob: 23b47ba7290d3e3daacebf08911e706cd0da0e2f [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Apache Druid">
<meta name="keywords" content="druid,kafka,database,analytics,streaming,real-time,real time,apache,open source">
<meta name="author" content="Apache Software Foundation">
<title>Druid | Querying Your Data</title>
<link rel="alternate" type="application/atom+xml" href="/feed">
<link rel="shortcut icon" href="/img/favicon.png">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
<link href='//fonts.googleapis.com/css?family=Open+Sans+Condensed:300,700,300italic|Open+Sans:300italic,400italic,600italic,400,300,600,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="/css/bootstrap-pure.css?v=1.1">
<link rel="stylesheet" href="/css/base.css?v=1.1">
<link rel="stylesheet" href="/css/header.css?v=1.1">
<link rel="stylesheet" href="/css/footer.css?v=1.1">
<link rel="stylesheet" href="/css/syntax.css?v=1.1">
<link rel="stylesheet" href="/css/docs.css?v=1.1">
<script>
(function() {
var cx = '000162378814775985090:molvbm0vggm';
var gcse = document.createElement('script');
gcse.type = 'text/javascript';
gcse.async = true;
gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
'//cse.google.com/cse.js?cx=' + cx;
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(gcse, s);
})();
</script>
</head>
<body>
<!-- Start page_header include -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<div class="top-navigator">
<div class="container">
<div class="left-cont">
<a class="logo" href="/"><span class="druid-logo"></span></a>
</div>
<div class="right-cont">
<ul class="links">
<li class=""><a href="/technology">Technology</a></li>
<li class=""><a href="/use-cases">Use Cases</a></li>
<li class=""><a href="/druid-powered">Powered By</a></li>
<li class=""><a href="/docs/latest/design/">Docs</a></li>
<li class=""><a href="/community/">Community</a></li>
<li class="header-dropdown">
<a>Apache</a>
<div class="header-dropdown-menu">
<a href="https://www.apache.org/" target="_blank">Foundation</a>
<a href="https://www.apache.org/events/current-event" target="_blank">Events</a>
<a href="https://www.apache.org/licenses/" target="_blank">License</a>
<a href="https://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a>
<a href="https://www.apache.org/security/" target="_blank">Security</a>
<a href="https://www.apache.org/foundation/sponsorship.html" target="_blank">Sponsorship</a>
</div>
</li>
<li class=" button-link"><a href="/downloads.html">Download</a></li>
</ul>
</div>
</div>
<div class="action-button menu-icon">
<span class="fa fa-bars"></span> MENU
</div>
<div class="action-button menu-icon-close">
<span class="fa fa-times"></span> MENU
</div>
</div>
<script type="text/javascript">
var $menu = $('.right-cont');
var $menuIcon = $('.menu-icon');
var $menuIconClose = $('.menu-icon-close');
function showMenu() {
$menu.fadeIn(100);
$menuIcon.fadeOut(100);
$menuIconClose.fadeIn(100);
}
$menuIcon.click(showMenu);
function hideMenu() {
$menu.fadeOut(100);
$menuIconClose.fadeOut(100);
$menuIcon.fadeIn(100);
}
$menuIconClose.click(hideMenu);
$(window).resize(function() {
if ($(window).width() >= 840) {
$menu.fadeIn(100);
$menuIcon.fadeOut(100);
$menuIconClose.fadeOut(100);
}
else {
$menu.fadeOut(100);
$menuIcon.fadeIn(100);
$menuIconClose.fadeOut(100);
}
});
</script>
<!-- Stop page_header include -->
<link rel="stylesheet" href="/css/blogs.css">
<div class="blog druid-header">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="title-image-wrap">
</div>
</div>
</div>
</div>
<div class="container blog">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="blog-entry">
<h1>Querying Your Data</h1>
<p class="text-muted">by <span class="author text-uppercase">Russell Jurney</span> · November 4, 2013</p>
<p>Before we start querying druid, we&#39;re going to finish setting up a complete cluster on localhost. In our previous posts, we setup a Realtime node. In this tutorial we will also setup the other Druid node types: Compute, Master and Broker.</p>
<h2 id="booting-a-broker-node">Booting a Broker Node</h2>
<ol>
<li>Setup a config file at config/broker/runtime.properties that looks like this: <a href="https://gist.github.com/rjurney/5818837">https://gist.github.com/rjurney/5818837</a></li>
<li>Run the broker node:</li>
</ol>
<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span></span>java -Xmx256m -Duser.timezone<span class="o">=</span>UTC -Dfile.encoding<span class="o">=</span>UTF-8 <span class="se">\</span>
-Ddruid.realtime.specFile<span class="o">=</span>realtime.spec <span class="se">\</span>
-classpath services/target/druid-services-0.5.6-SNAPSHOT-selfcontained.jar:config/broker <span class="se">\</span>
com.metamx.druid.http.BrokerMain
</code></pre></div>
<h2 id="booting-a-master-node">Booting a Master Node</h2>
<ol>
<li>Setup a config file at config/master/runtime.properties that looks like this: <a href="https://gist.github.com/rjurney/5818870">https://gist.github.com/rjurney/5818870</a></li>
<li>Run the master node:</li>
</ol>
<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span></span>java -Xmx256m -Duser.timezone<span class="o">=</span>UTC -Dfile.encoding<span class="o">=</span>UTF-8 <span class="se">\</span>
-classpath services/target/druid-services-0.5.6-SNAPSHOT-selfcontained.jar:config/master <span class="se">\</span>
com.metamx.druid.http.MasterMain
</code></pre></div>
<h2 id="booting-a-realtime-node">Booting a Realtime Node</h2>
<ol>
<li><p>Setup a config file at config/realtime/runtime.properties that looks like this: <a href="https://gist.github.com/rjurney/5818774">https://gist.github.com/rjurney/5818774</a></p></li>
<li><p>Setup a realtime.spec file like this: <a href="https://gist.github.com/rjurney/5818779">https://gist.github.com/rjurney/5818779</a></p></li>
<li><p>Run the realtime node:</p></li>
</ol>
<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span></span>java -Xmx256m -Duser.timezone<span class="o">=</span>UTC -Dfile.encoding<span class="o">=</span>UTF-8 <span class="se">\</span>
-Ddruid.realtime.specFile<span class="o">=</span>realtime.spec <span class="se">\</span>
-classpath services/target/druid-services-0.5.6-SNAPSHOT-selfcontained.jar:config/realtime <span class="se">\</span>
com.metamx.druid.realtime.RealtimeMain
</code></pre></div>
<h2 id="booting-a-compute-node">Booting a Compute Node</h2>
<ol>
<li>Setup a config file at config/compute/runtime.properties that looks like this: <a href="https://gist.github.com/rjurney/5818885">https://gist.github.com/rjurney/5818885</a></li>
<li>Run the compute node:</li>
</ol>
<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span></span>java -Xmx256m -Duser.timezone<span class="o">=</span>UTC -Dfile.encoding<span class="o">=</span>UTF-8 <span class="se">\</span>
-classpath services/target/druid-services-0.5.6-SNAPSHOT-selfcontained.jar:config/compute <span class="se">\</span>
com.metamx.druid.http.ComputeMain
</code></pre></div>
<h1 id="querying-your-data">Querying Your Data</h1>
<p>Now that we have a complete cluster setup on localhost, we need to load data. To do so, refer to <a href="/blog/2013/08/30/loading-data.html">Loading Your Data</a>. Having done that, its time to query our data!</p>
<h2 id="querying-different-nodes">Querying Different Nodes</h2>
<p>As a shared-nothing system, there are three ways to query druid, against the Realtime, Compute or Broker node. Querying a Realtime node returns only realtime data, querying a compute node returns only historical segments. Querying the broker will query both realtime and compute segments and compose an overall result for the query. This is the normal mode of operation for queries in druid.</p>
<h3 id="construct-a-query">Construct a Query</h3>
<p>For constructing this query, see below at: Querying Against the realtime.spec</p>
<div class="highlight"><pre><code class="language-json" data-lang="json"><span></span><span class="p">{</span>
<span class="nt">&quot;queryType&quot;</span><span class="p">:</span> <span class="s2">&quot;groupBy&quot;</span><span class="p">,</span>
<span class="nt">&quot;dataSource&quot;</span><span class="p">:</span> <span class="s2">&quot;druidtest&quot;</span><span class="p">,</span>
<span class="nt">&quot;granularity&quot;</span><span class="p">:</span> <span class="s2">&quot;all&quot;</span><span class="p">,</span>
<span class="nt">&quot;dimensions&quot;</span><span class="p">:</span> <span class="p">[],</span>
<span class="nt">&quot;aggregations&quot;</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span><span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;count&quot;</span><span class="p">,</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;rows&quot;</span><span class="p">},</span>
<span class="p">{</span><span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;longSum&quot;</span><span class="p">,</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;imps&quot;</span><span class="p">,</span> <span class="nt">&quot;fieldName&quot;</span><span class="p">:</span> <span class="s2">&quot;impressions&quot;</span><span class="p">},</span>
<span class="p">{</span><span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;doubleSum&quot;</span><span class="p">,</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;wp&quot;</span><span class="p">,</span> <span class="nt">&quot;fieldName&quot;</span><span class="p">:</span> <span class="s2">&quot;wp&quot;</span><span class="p">}</span>
<span class="p">],</span>
<span class="nt">&quot;intervals&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;2010-01-01T00:00/2020-01-01T00&quot;</span><span class="p">]</span>
<span class="p">}</span>
</code></pre></div>
<h3 id="querying-the-realtime-node">Querying the Realtime Node</h3>
<p>Run our query against port 8080:</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span></span>curl -X POST <span class="s2">&quot;http://localhost:8080/druid/v2/?pretty&quot;</span> <span class="se">\</span>
-H <span class="s1">&#39;content-type: application/json&#39;</span> -d @query.body
</code></pre></div>
<p>See our result:</p>
<div class="highlight"><pre><code class="language-json" data-lang="json"><span></span><span class="p">[</span> <span class="p">{</span>
<span class="nt">&quot;version&quot;</span> <span class="p">:</span> <span class="s2">&quot;v1&quot;</span><span class="p">,</span>
<span class="nt">&quot;timestamp&quot;</span> <span class="p">:</span> <span class="s2">&quot;2010-01-01T00:00:00.000Z&quot;</span><span class="p">,</span>
<span class="nt">&quot;event&quot;</span> <span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;imps&quot;</span> <span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
<span class="nt">&quot;wp&quot;</span> <span class="p">:</span> <span class="mf">15000.0</span><span class="p">,</span>
<span class="nt">&quot;rows&quot;</span> <span class="p">:</span> <span class="mi">5</span>
<span class="p">}</span>
<span class="p">}</span> <span class="p">]</span>
</code></pre></div>
<h3 id="querying-the-compute-node">Querying the Compute Node</h3>
<p>Run the query against port 8082:</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span></span>curl -X POST <span class="s2">&quot;http://localhost:8082/druid/v2/?pretty&quot;</span> <span class="se">\</span>
-H <span class="s1">&#39;content-type: application/json&#39;</span> -d @query.body
</code></pre></div>
<p>And get (similar to):</p>
<div class="highlight"><pre><code class="language-json" data-lang="json"><span></span><span class="p">[</span> <span class="p">{</span>
<span class="nt">&quot;version&quot;</span> <span class="p">:</span> <span class="s2">&quot;v1&quot;</span><span class="p">,</span>
<span class="nt">&quot;timestamp&quot;</span> <span class="p">:</span> <span class="s2">&quot;2010-01-01T00:00:00.000Z&quot;</span><span class="p">,</span>
<span class="nt">&quot;event&quot;</span> <span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;imps&quot;</span> <span class="p">:</span> <span class="mi">27</span><span class="p">,</span>
<span class="nt">&quot;wp&quot;</span> <span class="p">:</span> <span class="mf">77000.0</span><span class="p">,</span>
<span class="nt">&quot;rows&quot;</span> <span class="p">:</span> <span class="mi">9</span>
<span class="p">}</span>
<span class="p">}</span> <span class="p">]</span>
</code></pre></div>
<h3 id="querying-both-nodes-via-the-broker">Querying both Nodes via the Broker</h3>
<p>Run the query against port 8083:</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span></span>curl -X POST <span class="s2">&quot;http://localhost:8083/druid/v2/?pretty&quot;</span> <span class="se">\</span>
-H <span class="s1">&#39;content-type: application/json&#39;</span> -d @query.body
</code></pre></div>
<p>And get:</p>
<div class="highlight"><pre><code class="language-json" data-lang="json"><span></span><span class="p">[</span> <span class="p">{</span>
<span class="nt">&quot;version&quot;</span> <span class="p">:</span> <span class="s2">&quot;v1&quot;</span><span class="p">,</span>
<span class="nt">&quot;timestamp&quot;</span> <span class="p">:</span> <span class="s2">&quot;2010-01-01T00:00:00.000Z&quot;</span><span class="p">,</span>
<span class="nt">&quot;event&quot;</span> <span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;imps&quot;</span> <span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
<span class="nt">&quot;wp&quot;</span> <span class="p">:</span> <span class="mf">15000.0</span><span class="p">,</span>
<span class="nt">&quot;rows&quot;</span> <span class="p">:</span> <span class="mi">5</span>
<span class="p">}</span>
<span class="p">}</span> <span class="p">]</span>
</code></pre></div>
<p>Now that we know what nodes can be queried (although you should usually use the broker node), lets learn how to know what queries are available.</p>
<h2 id="querying-against-the-realtime-spec">Querying Against the realtime.spec</h2>
<p>How are we to know what queries we can run? Although <a href="/docs/latest/Querying.html">Querying</a> is a helpful index, to get a handle on querying our data we need to look at our Realtime node&#39;s realtime.spec file:</p>
<div class="highlight"><pre><code class="language-json" data-lang="json"><span></span><span class="p">[{</span>
<span class="nt">&quot;schema&quot;</span> <span class="p">:</span> <span class="p">{</span> <span class="nt">&quot;dataSource&quot;</span><span class="p">:</span><span class="s2">&quot;druidtest&quot;</span><span class="p">,</span>
<span class="nt">&quot;aggregators&quot;</span><span class="p">:[</span> <span class="p">{</span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;count&quot;</span><span class="p">,</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;impressions&quot;</span><span class="p">},</span>
<span class="p">{</span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;doubleSum&quot;</span><span class="p">,</span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;wp&quot;</span><span class="p">,</span><span class="nt">&quot;fieldName&quot;</span><span class="p">:</span><span class="s2">&quot;wp&quot;</span><span class="p">}],</span>
<span class="nt">&quot;indexGranularity&quot;</span><span class="p">:</span><span class="s2">&quot;minute&quot;</span><span class="p">,</span>
<span class="nt">&quot;shardSpec&quot;</span> <span class="p">:</span> <span class="p">{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;none&quot;</span> <span class="p">}</span> <span class="p">},</span>
<span class="nt">&quot;config&quot;</span> <span class="p">:</span> <span class="p">{</span> <span class="nt">&quot;maxRowsInMemory&quot;</span> <span class="p">:</span> <span class="mi">500000</span><span class="p">,</span>
<span class="nt">&quot;intermediatePersistPeriod&quot;</span> <span class="p">:</span> <span class="s2">&quot;PT10m&quot;</span> <span class="p">},</span>
<span class="nt">&quot;firehose&quot;</span> <span class="p">:</span> <span class="p">{</span> <span class="nt">&quot;type&quot;</span> <span class="p">:</span> <span class="s2">&quot;kafka-0.7.2&quot;</span><span class="p">,</span>
<span class="nt">&quot;consumerProps&quot;</span> <span class="p">:</span> <span class="p">{</span> <span class="nt">&quot;zk.connect&quot;</span> <span class="p">:</span> <span class="s2">&quot;localhost:2181&quot;</span><span class="p">,</span>
<span class="nt">&quot;zk.connectiontimeout.ms&quot;</span> <span class="p">:</span> <span class="s2">&quot;15000&quot;</span><span class="p">,</span>
<span class="nt">&quot;zk.sessiontimeout.ms&quot;</span> <span class="p">:</span> <span class="s2">&quot;15000&quot;</span><span class="p">,</span>
<span class="nt">&quot;zk.synctime.ms&quot;</span> <span class="p">:</span> <span class="s2">&quot;5000&quot;</span><span class="p">,</span>
<span class="nt">&quot;groupid&quot;</span> <span class="p">:</span> <span class="s2">&quot;topic-pixel-local&quot;</span><span class="p">,</span>
<span class="nt">&quot;fetch.size&quot;</span> <span class="p">:</span> <span class="s2">&quot;1048586&quot;</span><span class="p">,</span>
<span class="nt">&quot;autooffset.reset&quot;</span> <span class="p">:</span> <span class="s2">&quot;largest&quot;</span><span class="p">,</span>
<span class="nt">&quot;autocommit.enable&quot;</span> <span class="p">:</span> <span class="s2">&quot;false&quot;</span> <span class="p">},</span>
<span class="nt">&quot;feed&quot;</span> <span class="p">:</span> <span class="s2">&quot;druidtest&quot;</span><span class="p">,</span>
<span class="nt">&quot;parser&quot;</span> <span class="p">:</span> <span class="p">{</span> <span class="nt">&quot;timestampSpec&quot;</span> <span class="p">:</span> <span class="p">{</span> <span class="nt">&quot;column&quot;</span> <span class="p">:</span> <span class="s2">&quot;utcdt&quot;</span><span class="p">,</span> <span class="nt">&quot;format&quot;</span> <span class="p">:</span> <span class="s2">&quot;iso&quot;</span> <span class="p">},</span>
<span class="nt">&quot;data&quot;</span> <span class="p">:</span> <span class="p">{</span> <span class="nt">&quot;format&quot;</span> <span class="p">:</span> <span class="s2">&quot;json&quot;</span> <span class="p">},</span>
<span class="nt">&quot;dimensionExclusions&quot;</span> <span class="p">:</span> <span class="p">[</span><span class="s2">&quot;wp&quot;</span><span class="p">]</span> <span class="p">}</span> <span class="p">},</span>
<span class="nt">&quot;plumber&quot;</span> <span class="p">:</span> <span class="p">{</span> <span class="nt">&quot;type&quot;</span> <span class="p">:</span> <span class="s2">&quot;realtime&quot;</span><span class="p">,</span>
<span class="nt">&quot;windowPeriod&quot;</span> <span class="p">:</span> <span class="s2">&quot;PT10m&quot;</span><span class="p">,</span>
<span class="nt">&quot;segmentGranularity&quot;</span><span class="p">:</span><span class="s2">&quot;hour&quot;</span><span class="p">,</span>
<span class="nt">&quot;basePersistDirectory&quot;</span> <span class="p">:</span> <span class="s2">&quot;/tmp/realtime/basePersist&quot;</span><span class="p">,</span>
<span class="nt">&quot;rejectionPolicy&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;messageTime&quot;</span><span class="p">}</span> <span class="p">}</span>
<span class="p">}]</span>
</code></pre></div>
<h3 id="datasource">dataSource</h3>
<div class="highlight"><pre><code class="language-json" data-lang="json"><span></span><span class="s2">&quot;dataSource&quot;</span><span class="err">:</span><span class="s2">&quot;druidtest&quot;</span>
</code></pre></div>
<p>Our dataSource tells us the name of the relation/table, or &#39;source of data&#39;, to query in both our realtime.spec and query.body!</p>
<h3 id="aggregations">aggregations</h3>
<p>Note the <a href="/docs/latest/Aggregations.html">aggregations</a> in our query:</p>
<div class="highlight"><pre><code class="language-json" data-lang="json"><span></span> <span class="s2">&quot;aggregations&quot;</span><span class="err">:</span> <span class="p">[</span>
<span class="p">{</span><span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;count&quot;</span><span class="p">,</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;rows&quot;</span><span class="p">},</span>
<span class="p">{</span><span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;longSum&quot;</span><span class="p">,</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;imps&quot;</span><span class="p">,</span> <span class="nt">&quot;fieldName&quot;</span><span class="p">:</span> <span class="s2">&quot;impressions&quot;</span><span class="p">},</span>
<span class="p">{</span><span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;doubleSum&quot;</span><span class="p">,</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;wp&quot;</span><span class="p">,</span> <span class="nt">&quot;fieldName&quot;</span><span class="p">:</span> <span class="s2">&quot;wp&quot;</span><span class="p">}</span>
<span class="p">]</span><span class="err">,</span>
</code></pre></div>
<p>this matches up to the aggregators in the schema of our realtime.spec!</p>
<div class="highlight"><pre><code class="language-json" data-lang="json"><span></span><span class="s2">&quot;aggregators&quot;</span><span class="err">:</span><span class="p">[</span> <span class="p">{</span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;count&quot;</span><span class="p">,</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;impressions&quot;</span><span class="p">},</span>
<span class="p">{</span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;doubleSum&quot;</span><span class="p">,</span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;wp&quot;</span><span class="p">,</span><span class="nt">&quot;fieldName&quot;</span><span class="p">:</span><span class="s2">&quot;wp&quot;</span><span class="p">}]</span><span class="err">,</span>
</code></pre></div>
<h3 id="dimensions">dimensions</h3>
<p>Lets look back at our actual records (from <a href="/blog/2013/08/30/loading-data.html">Loading Your Data</a>:</p>
<div class="highlight"><pre><code class="language-json" data-lang="json"><span></span><span class="p">{</span><span class="nt">&quot;utcdt&quot;</span><span class="p">:</span> <span class="s2">&quot;2010-01-01T01:01:01&quot;</span><span class="p">,</span> <span class="nt">&quot;wp&quot;</span><span class="p">:</span> <span class="mi">1000</span><span class="p">,</span> <span class="nt">&quot;gender&quot;</span><span class="p">:</span> <span class="s2">&quot;male&quot;</span><span class="p">,</span> <span class="nt">&quot;age&quot;</span><span class="p">:</span> <span class="mi">100</span><span class="p">}</span>
<span class="p">{</span><span class="nt">&quot;utcdt&quot;</span><span class="p">:</span> <span class="s2">&quot;2010-01-01T01:01:02&quot;</span><span class="p">,</span> <span class="nt">&quot;wp&quot;</span><span class="p">:</span> <span class="mi">2000</span><span class="p">,</span> <span class="nt">&quot;gender&quot;</span><span class="p">:</span> <span class="s2">&quot;female&quot;</span><span class="p">,</span> <span class="nt">&quot;age&quot;</span><span class="p">:</span> <span class="mi">50</span><span class="p">}</span>
<span class="p">{</span><span class="nt">&quot;utcdt&quot;</span><span class="p">:</span> <span class="s2">&quot;2010-01-01T01:01:03&quot;</span><span class="p">,</span> <span class="nt">&quot;wp&quot;</span><span class="p">:</span> <span class="mi">3000</span><span class="p">,</span> <span class="nt">&quot;gender&quot;</span><span class="p">:</span> <span class="s2">&quot;male&quot;</span><span class="p">,</span> <span class="nt">&quot;age&quot;</span><span class="p">:</span> <span class="mi">20</span><span class="p">}</span>
<span class="p">{</span><span class="nt">&quot;utcdt&quot;</span><span class="p">:</span> <span class="s2">&quot;2010-01-01T01:01:04&quot;</span><span class="p">,</span> <span class="nt">&quot;wp&quot;</span><span class="p">:</span> <span class="mi">4000</span><span class="p">,</span> <span class="nt">&quot;gender&quot;</span><span class="p">:</span> <span class="s2">&quot;female&quot;</span><span class="p">,</span> <span class="nt">&quot;age&quot;</span><span class="p">:</span> <span class="mi">30</span><span class="p">}</span>
<span class="p">{</span><span class="nt">&quot;utcdt&quot;</span><span class="p">:</span> <span class="s2">&quot;2010-01-01T01:01:05&quot;</span><span class="p">,</span> <span class="nt">&quot;wp&quot;</span><span class="p">:</span> <span class="mi">5000</span><span class="p">,</span> <span class="nt">&quot;gender&quot;</span><span class="p">:</span> <span class="s2">&quot;male&quot;</span><span class="p">,</span> <span class="nt">&quot;age&quot;</span><span class="p">:</span> <span class="mi">40</span><span class="p">}</span>
</code></pre></div>
<p>Note that we have two dimensions to our data, other than our primary metric, wp. They are &#39;gender&#39; and &#39;age&#39;. We can specify these in our query! Note that we have added a dimension: age, below.</p>
<div class="highlight"><pre><code class="language-json" data-lang="json"><span></span><span class="p">{</span>
<span class="nt">&quot;queryType&quot;</span><span class="p">:</span> <span class="s2">&quot;groupBy&quot;</span><span class="p">,</span>
<span class="nt">&quot;dataSource&quot;</span><span class="p">:</span> <span class="s2">&quot;druidtest&quot;</span><span class="p">,</span>
<span class="nt">&quot;granularity&quot;</span><span class="p">:</span> <span class="s2">&quot;all&quot;</span><span class="p">,</span>
<span class="nt">&quot;dimensions&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;age&quot;</span><span class="p">],</span>
<span class="nt">&quot;aggregations&quot;</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span><span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;count&quot;</span><span class="p">,</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;rows&quot;</span><span class="p">},</span>
<span class="p">{</span><span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;longSum&quot;</span><span class="p">,</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;imps&quot;</span><span class="p">,</span> <span class="nt">&quot;fieldName&quot;</span><span class="p">:</span> <span class="s2">&quot;impressions&quot;</span><span class="p">},</span>
<span class="p">{</span><span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;doubleSum&quot;</span><span class="p">,</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;wp&quot;</span><span class="p">,</span> <span class="nt">&quot;fieldName&quot;</span><span class="p">:</span> <span class="s2">&quot;wp&quot;</span><span class="p">}</span>
<span class="p">],</span>
<span class="nt">&quot;intervals&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;2010-01-01T00:00/2020-01-01T00&quot;</span><span class="p">]</span>
<span class="p">}</span>
</code></pre></div>
<p>Which gets us grouped data in return!</p>
<div class="highlight"><pre><code class="language-json" data-lang="json"><span></span><span class="p">[</span> <span class="p">{</span>
<span class="nt">&quot;version&quot;</span> <span class="p">:</span> <span class="s2">&quot;v1&quot;</span><span class="p">,</span>
<span class="nt">&quot;timestamp&quot;</span> <span class="p">:</span> <span class="s2">&quot;2010-01-01T00:00:00.000Z&quot;</span><span class="p">,</span>
<span class="nt">&quot;event&quot;</span> <span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;imps&quot;</span> <span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="nt">&quot;age&quot;</span> <span class="p">:</span> <span class="s2">&quot;100&quot;</span><span class="p">,</span>
<span class="nt">&quot;wp&quot;</span> <span class="p">:</span> <span class="mf">1000.0</span><span class="p">,</span>
<span class="nt">&quot;rows&quot;</span> <span class="p">:</span> <span class="mi">1</span>
<span class="p">}</span>
<span class="p">},</span> <span class="p">{</span>
<span class="nt">&quot;version&quot;</span> <span class="p">:</span> <span class="s2">&quot;v1&quot;</span><span class="p">,</span>
<span class="nt">&quot;timestamp&quot;</span> <span class="p">:</span> <span class="s2">&quot;2010-01-01T00:00:00.000Z&quot;</span><span class="p">,</span>
<span class="nt">&quot;event&quot;</span> <span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;imps&quot;</span> <span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="nt">&quot;age&quot;</span> <span class="p">:</span> <span class="s2">&quot;20&quot;</span><span class="p">,</span>
<span class="nt">&quot;wp&quot;</span> <span class="p">:</span> <span class="mf">3000.0</span><span class="p">,</span>
<span class="nt">&quot;rows&quot;</span> <span class="p">:</span> <span class="mi">1</span>
<span class="p">}</span>
<span class="p">},</span> <span class="p">{</span>
<span class="nt">&quot;version&quot;</span> <span class="p">:</span> <span class="s2">&quot;v1&quot;</span><span class="p">,</span>
<span class="nt">&quot;timestamp&quot;</span> <span class="p">:</span> <span class="s2">&quot;2010-01-01T00:00:00.000Z&quot;</span><span class="p">,</span>
<span class="nt">&quot;event&quot;</span> <span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;imps&quot;</span> <span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="nt">&quot;age&quot;</span> <span class="p">:</span> <span class="s2">&quot;30&quot;</span><span class="p">,</span>
<span class="nt">&quot;wp&quot;</span> <span class="p">:</span> <span class="mf">4000.0</span><span class="p">,</span>
<span class="nt">&quot;rows&quot;</span> <span class="p">:</span> <span class="mi">1</span>
<span class="p">}</span>
<span class="p">},</span> <span class="p">{</span>
<span class="nt">&quot;version&quot;</span> <span class="p">:</span> <span class="s2">&quot;v1&quot;</span><span class="p">,</span>
<span class="nt">&quot;timestamp&quot;</span> <span class="p">:</span> <span class="s2">&quot;2010-01-01T00:00:00.000Z&quot;</span><span class="p">,</span>
<span class="nt">&quot;event&quot;</span> <span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;imps&quot;</span> <span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="nt">&quot;age&quot;</span> <span class="p">:</span> <span class="s2">&quot;40&quot;</span><span class="p">,</span>
<span class="nt">&quot;wp&quot;</span> <span class="p">:</span> <span class="mf">5000.0</span><span class="p">,</span>
<span class="nt">&quot;rows&quot;</span> <span class="p">:</span> <span class="mi">1</span>
<span class="p">}</span>
<span class="p">},</span> <span class="p">{</span>
<span class="nt">&quot;version&quot;</span> <span class="p">:</span> <span class="s2">&quot;v1&quot;</span><span class="p">,</span>
<span class="nt">&quot;timestamp&quot;</span> <span class="p">:</span> <span class="s2">&quot;2010-01-01T00:00:00.000Z&quot;</span><span class="p">,</span>
<span class="nt">&quot;event&quot;</span> <span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;imps&quot;</span> <span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="nt">&quot;age&quot;</span> <span class="p">:</span> <span class="s2">&quot;50&quot;</span><span class="p">,</span>
<span class="nt">&quot;wp&quot;</span> <span class="p">:</span> <span class="mf">2000.0</span><span class="p">,</span>
<span class="nt">&quot;rows&quot;</span> <span class="p">:</span> <span class="mi">1</span>
<span class="p">}</span>
<span class="p">}</span> <span class="p">]</span>
</code></pre></div>
<h3 id="filtering">filtering</h3>
<p>Now that we&#39;ve observed our dimensions, we can also filter:</p>
<div class="highlight"><pre><code class="language-json" data-lang="json"><span></span><span class="p">{</span>
<span class="nt">&quot;queryType&quot;</span><span class="p">:</span> <span class="s2">&quot;groupBy&quot;</span><span class="p">,</span>
<span class="nt">&quot;dataSource&quot;</span><span class="p">:</span> <span class="s2">&quot;druidtest&quot;</span><span class="p">,</span>
<span class="nt">&quot;granularity&quot;</span><span class="p">:</span> <span class="s2">&quot;all&quot;</span><span class="p">,</span>
<span class="nt">&quot;filter&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;selector&quot;</span><span class="p">,</span>
<span class="nt">&quot;dimension&quot;</span><span class="p">:</span> <span class="s2">&quot;gender&quot;</span><span class="p">,</span>
<span class="nt">&quot;value&quot;</span><span class="p">:</span> <span class="s2">&quot;male&quot;</span>
<span class="p">},</span>
<span class="nt">&quot;aggregations&quot;</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span><span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;count&quot;</span><span class="p">,</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;rows&quot;</span><span class="p">},</span>
<span class="p">{</span><span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;longSum&quot;</span><span class="p">,</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;imps&quot;</span><span class="p">,</span> <span class="nt">&quot;fieldName&quot;</span><span class="p">:</span> <span class="s2">&quot;impressions&quot;</span><span class="p">},</span>
<span class="p">{</span><span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;doubleSum&quot;</span><span class="p">,</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;wp&quot;</span><span class="p">,</span> <span class="nt">&quot;fieldName&quot;</span><span class="p">:</span> <span class="s2">&quot;wp&quot;</span><span class="p">}</span>
<span class="p">],</span>
<span class="nt">&quot;intervals&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;2010-01-01T00:00/2020-01-01T00&quot;</span><span class="p">]</span>
<span class="p">}</span>
</code></pre></div>
<p>Which gets us just people aged 40:</p>
<div class="highlight"><pre><code class="language-json" data-lang="json"><span></span><span class="p">[</span> <span class="p">{</span>
<span class="nt">&quot;version&quot;</span> <span class="p">:</span> <span class="s2">&quot;v1&quot;</span><span class="p">,</span>
<span class="nt">&quot;timestamp&quot;</span> <span class="p">:</span> <span class="s2">&quot;2010-01-01T00:00:00.000Z&quot;</span><span class="p">,</span>
<span class="nt">&quot;event&quot;</span> <span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;imps&quot;</span> <span class="p">:</span> <span class="mi">3</span><span class="p">,</span>
<span class="nt">&quot;wp&quot;</span> <span class="p">:</span> <span class="mf">9000.0</span><span class="p">,</span>
<span class="nt">&quot;rows&quot;</span> <span class="p">:</span> <span class="mi">3</span>
<span class="p">}</span>
<span class="p">}</span> <span class="p">]</span>
</code></pre></div>
<p>Check out <a href="/docs/latest/Filters.html">Filters</a> for more.</p>
<h2 id="learn-more">Learn More</h2>
<p>Finally, you can learn more about querying at <a href="/docs/latest/Querying.html">Querying</a>!</p>
</div>
</div>
</div>
</div>
<!-- Start page_footer include -->
<footer class="druid-footer">
<div class="container">
<div class="text-center">
<p>
<a href="/technology">Technology</a>&ensp;·&ensp;
<a href="/use-cases">Use Cases</a>&ensp;·&ensp;
<a href="/druid-powered">Powered by Druid</a>&ensp;·&ensp;
<a href="/docs/latest/">Docs</a>&ensp;·&ensp;
<a href="/community/">Community</a>&ensp;·&ensp;
<a href="/downloads.html">Download</a>&ensp;·&ensp;
<a href="/faq">FAQ</a>
</p>
</div>
<div class="text-center">
<a title="Join the user group" href="https://groups.google.com/forum/#!forum/druid-user" target="_blank"><span class="fa fa-comments"></span></a>&ensp;·&ensp;
<a title="Follow Druid" href="https://twitter.com/druidio" target="_blank"><span class="fab fa-twitter"></span></a>&ensp;·&ensp;
<a title="GitHub" href="https://github.com/apache/druid" target="_blank"><span class="fab fa-github"></span></a>
</div>
<div class="text-center license">
Copyright © 2020 <a href="https://www.apache.org/" target="_blank">Apache Software Foundation</a>.<br>
Except where otherwise noted, licensed under <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA 4.0</a>.<br>
Apache Druid, Druid, and the Druid logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States and other countries.
</div>
</div>
</footer>
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-131010415-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-131010415-1');
</script>
<script>
function trackDownload(type, url) {
ga('send', 'event', 'download', type, url);
}
</script>
<script src="//code.jquery.com/jquery.min.js"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script src="/assets/js/druid.js"></script>
<!-- stop page_footer include -->
</body>
</html>