"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 c},contentTitle:function(){return a},default:function(){return p},frontMatter:function(){return o},metadata:function(){return i},toc:function(){return s}});var n=r(83117),l=(r(67294),r(3905));const o={title:"Apache Drill",hide_title:!0,sidebar_position:6,version:1},a=void 0,i={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",draft:!1,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"}},c={},s=[{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}],u={toc:s},d="wrapper";function p(e){let{components:t,...r}=e;return(0,l.kt)(d,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h2",{id:"apache-drill"},"Apache Drill"),(0,l.kt)("h3",{id:"sqlalchemy"},"SQLAlchemy"),(0,l.kt)("p",null,"The recommended way to connect to Apache Drill is through SQLAlchemy. You can use the\n",(0,l.kt)("a",{parentName:"p",href:"https://github.com/JohnOmernik/sqlalchemy-drill"},"sqlalchemy-drill")," package."),(0,l.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,l.kt)("p",null,"The basic connection string for Drill looks like this:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"drill+sadrill://<username>:<password>@<host>:<port>/<storage_plugin>?use_ssl=True\n")),(0,l.kt)("p",null,"To connect to Drill running on a local machine running in embedded mode you can use the following\nconnection string:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"drill+sadrill://localhost:8047/dfs?use_ssl=False\n")),(0,l.kt)("h3",{id:"jdbc"},"JDBC"),(0,l.kt)("p",null,"Connecting to Drill through JDBC is more complicated and we recommend following\n",(0,l.kt)("a",{parentName:"p",href:"https://drill.apache.org/docs/using-the-jdbc-driver/"},"this tutorial"),"."),(0,l.kt)("p",null,"The connection string looks like:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"drill+jdbc://<username>:<password>@<host>:<port>\n")),(0,l.kt)("h3",{id:"odbc"},"ODBC"),(0,l.kt)("p",null,"We recommend reading the\n",(0,l.kt)("a",{parentName:"p",href:"https://drill.apache.org/docs/installing-the-driver-on-linux/"},"Apache Drill documentation")," and read\nthe ",(0,l.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."))}p.isMDXComponent=!0},3905:function(e,t,r){r.d(t,{Zo:function(){return u},kt:function(){return m}});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="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=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"]),d=s(r),h=l,m=d["".concat(c,".").concat(h)]||d[h]||p[h]||o;return r?n.createElement(m,a(a({ref:t},u),{},{components:r})):n.createElement(m,a({ref:t},u))}));function m(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=h;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[d]="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)}h.displayName="MDXCreateElement"}}]);