"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[3672],{19902:function(e,t,r){r.r(t),r.d(t,{assets:function(){return u},contentTitle:function(){return c},default:function(){return h},frontMatter:function(){return i},metadata:function(){return s},toc:function(){return d}});var n=r(83117),l=r(80102),o=(r(67294),r(3905)),a=["components"],i={title:"Apache Drill",hide_title:!0,sidebar_position:6,version:1},c=void 0,s={unversionedId:"databases/drill",id:"databases/drill",title:"Apache Drill",description:"Apache Drill",source:"@site/docs/databases/drill.mdx",sourceDirName:"databases",slug:"/databases/drill",permalink:"/docs/databases/drill",editUrl:"https://github.com/apache/superset/tree/master/docs/docs/databases/drill.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"Apache Drill",hide_title:!0,sidebar_position:6,version:1},sidebar:"tutorialSidebar",previous:{title:"Amazon Redshift",permalink:"/docs/databases/redshift"},next:{title:"Apache Druid",permalink:"/docs/databases/druid"}},u={},d=[{value:"Apache Drill",id:"apache-drill",level:2},{value:"SQLAlchemy",id:"sqlalchemy",level:3},{value:"JDBC",id:"jdbc",level:3},{value:"ODBC",id:"odbc",level:3}],p={toc:d};function h(e){var t=e.components,r=(0,l.Z)(e,a);return(0,o.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"apache-drill"},"Apache Drill"),(0,o.kt)("h3",{id:"sqlalchemy"},"SQLAlchemy"),(0,o.kt)("p",null,"The recommended way to connect to Apache Drill is through SQLAlchemy. You can use the\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/JohnOmernik/sqlalchemy-drill"},"sqlalchemy-drill")," package."),(0,o.kt)("p",null,"Once that is done, you can connect to Drill in two ways, either via the REST interface or by JDBC.\nIf you are connecting via JDBC, you must have the Drill JDBC Driver installed."),(0,o.kt)("p",null,"The basic connection string for Drill looks like this:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"drill+sadrill://<username>:<password>@<host>:<port>/<storage_plugin>?use_ssl=True\n")),(0,o.kt)("p",null,"To connect to Drill running on a local machine running in embedded mode you can use the following\nconnection string:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"drill+sadrill://localhost:8047/dfs?use_ssl=False\n")),(0,o.kt)("h3",{id:"jdbc"},"JDBC"),(0,o.kt)("p",null,"Connecting to Drill through JDBC is more complicated and we recommend following\n",(0,o.kt)("a",{parentName:"p",href:"https://drill.apache.org/docs/using-the-jdbc-driver/"},"this tutorial"),"."),(0,o.kt)("p",null,"The connection string looks like:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"drill+jdbc://<username>:<password>@<host>:<port>\n")),(0,o.kt)("h3",{id:"odbc"},"ODBC"),(0,o.kt)("p",null,"We recommend reading the\n",(0,o.kt)("a",{parentName:"p",href:"https://drill.apache.org/docs/installing-the-driver-on-linux/"},"Apache Drill documentation")," and read\nthe ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/JohnOmernik/sqlalchemy-drill#usage-with-odbc"},"GitHub README")," to learn how to\nwork with Drill through ODBC."))}h.isMDXComponent=!0},3905:function(e,t,r){r.d(t,{Zo:function(){return u},kt:function(){return h}});var n=r(67294);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){l(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,l=function(e,t){if(null==e)return{};var r,n,l={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=s(r),h=l,m=p["".concat(c,".").concat(h)]||p[h]||d[h]||o;return r?n.createElement(m,a(a({ref:t},u),{},{components:r})):n.createElement(m,a({ref:t},u))}));function h(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=p;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i.mdxType="string"==typeof e?e:l,a[1]=i;for(var s=2;s<o;s++)a[s]=r[s];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}p.displayName="MDXCreateElement"}}]);