"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[340],{67666:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>s,default:()=>g,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=n(83117),a=(n(67294),n(3905)),i=n(51402);const o={title:"Apache Druid",hide_title:!0,sidebar_position:7,version:1},s=void 0,l={unversionedId:"databases/druid",id:"databases/druid",title:"Apache Druid",description:"Apache Druid",source:"@site/docs/databases/druid.mdx",sourceDirName:"databases",slug:"/databases/druid",permalink:"/docs/databases/druid",draft:!1,editUrl:"https://github.com/apache/superset/tree/master/docs/docs/databases/druid.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"Apache Druid",hide_title:!0,sidebar_position:7,version:1},sidebar:"tutorialSidebar",previous:{title:"Apache Drill",permalink:"/docs/databases/drill"},next:{title:"Apache Hive",permalink:"/docs/databases/hive"}},d={},c=[{value:"Apache Druid",id:"apache-druid",level:2},{value:"Customizing Druid Connection",id:"customizing-druid-connection",level:3},{value:"Aggregations",id:"aggregations",level:3},{value:"Post-Aggregations",id:"post-aggregations",level:3}],u={toc:c},p="wrapper";function g(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"apache-druid"},"Apache Druid"),(0,a.kt)("p",null,"A native connector to Druid ships with Superset (behind the ",(0,a.kt)("inlineCode",{parentName:"p"},"DRUID_IS_ACTIVE")," flag) but this is\nslowly getting deprecated in favor of the SQLAlchemy / DBAPI connector made available in the\n",(0,a.kt)("a",{parentName:"p",href:"https://pythonhosted.org/pydruid/"},"pydruid library"),"."),(0,a.kt)("p",null,"The connection string looks like:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"druid://<User>:<password>@<Host>:<Port-default-9088>/druid/v2/sql\n")),(0,a.kt)("p",null,"Here's a breakdown of the key components of this connection string:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"User"),": username portion of the credentials needed to connect to your database"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"Password"),": password portion of the credentials needed to connect to your database"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"Host"),": IP address (or URL) of the host machine that's running your database"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"Port"),": specific port that's exposed on your host machine where your database is running")),(0,a.kt)("h3",{id:"customizing-druid-connection"},"Customizing Druid Connection"),(0,a.kt)("p",null,"When adding a connection to Druid, you can customize the connection a few different ways in the\n",(0,a.kt)("strong",{parentName:"p"},"Add Database")," form."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Custom Certificate")),(0,a.kt)("p",null,"You can add certificates in the ",(0,a.kt)("strong",{parentName:"p"},"Root Certificate")," field when configuring the new database\nconnection to Druid:"),(0,a.kt)("img",{src:(0,i.Z)("/img/root-cert-example.png")})," ",(0,a.kt)("p",null,"When using a custom certificate, pydruid will automatically use https scheme."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Disable SSL Verification")),(0,a.kt)("p",null,"To disable SSL verification, add the following to the ",(0,a.kt)("strong",{parentName:"p"},"Extras")," field:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},'engine_params:\n{"connect_args":\n    {"scheme": "https", "ssl_verify_cert": false}}\n')),(0,a.kt)("h3",{id:"aggregations"},"Aggregations"),(0,a.kt)("p",null,"Common aggregations or Druid metrics can be defined and used in Superset. The first and simpler use\ncase is to use the checkbox matrix exposed in your datasource\u2019s edit view (",(0,a.kt)("strong",{parentName:"p"},"Sources -> Druid\nDatasources -> ","[your datasource]"," -> Edit -> ","[tab]"," List Druid Column"),")."),(0,a.kt)("p",null,"Clicking the GroupBy and Filterable checkboxes will make the column appear in the related dropdowns\nwhile in the Explore view. Checking Count Distinct, Min, Max or Sum will result in creating new\nmetrics that will appear in the ",(0,a.kt)("strong",{parentName:"p"},"List Druid Metric")," tab upon saving the datasource."),(0,a.kt)("p",null,"By editing these metrics, you\u2019ll notice that their JSON element corresponds to Druid aggregation\ndefinition. You can create your own aggregations manually from the ",(0,a.kt)("strong",{parentName:"p"},"List Druid Metric")," tab\nfollowing Druid documentation."),(0,a.kt)("h3",{id:"post-aggregations"},"Post-Aggregations"),(0,a.kt)("p",null,"Druid supports post aggregation and this works in Superset. All you have to do is create a metric,\nmuch like you would create an aggregation manually, but specify ",(0,a.kt)("inlineCode",{parentName:"p"},"postagg")," as a ",(0,a.kt)("inlineCode",{parentName:"p"},"Metric Type"),". You\nthen have to provide a valid json post-aggregation definition (as specified in the Druid docs) in\nthe JSON field."))}g.isMDXComponent=!0},3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),d=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=d(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=d(n),g=a,m=u["".concat(l,".").concat(g)]||u[g]||p[g]||i;return n?r.createElement(m,o(o({ref:t},c),{},{components:n})):r.createElement(m,o({ref:t},c))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var d=2;d<i;d++)o[d]=n[d];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}g.displayName="MDXCreateElement"}}]);