"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[8005],{38122:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var o=r(83117),n=(r(67294),r(3905));const a={title:"ClickHouse",hide_title:!0,sidebar_position:15,version:1},c=void 0,s={unversionedId:"databases/clickhouse",id:"databases/clickhouse",title:"ClickHouse",description:"ClickHouse",source:"@site/docs/databases/clickhouse.mdx",sourceDirName:"databases",slug:"/databases/clickhouse",permalink:"/docs/databases/clickhouse",draft:!1,editUrl:"https://github.com/apache/superset/tree/master/docs/docs/databases/clickhouse.mdx",tags:[],version:"current",sidebarPosition:15,frontMatter:{title:"ClickHouse",hide_title:!0,sidebar_position:15,version:1},sidebar:"tutorialSidebar",previous:{title:"Apache Spark SQL",permalink:"/docs/databases/spark-sql"},next:{title:"CockroachDB",permalink:"/docs/databases/cockroachdb"}},i={},l=[{value:"ClickHouse",id:"clickhouse",level:2}],u={toc:l},p="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(p,(0,o.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"clickhouse"},"ClickHouse"),(0,n.kt)("p",null,"To use ClickHouse with Superset, you will need to add the following Python library:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"clickhouse-connect>=0.6.8\n")),(0,n.kt)("p",null,"If running Superset using Docker Compose, add the following to your ",(0,n.kt)("inlineCode",{parentName:"p"},"./docker/requirements-local.txt")," file:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"clickhouse-connect>=0.6.8\n")),(0,n.kt)("p",null,"The recommended connector library for ClickHouse is\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/ClickHouse/clickhouse-connect"},"clickhouse-connect"),"."),(0,n.kt)("p",null,"The expected connection string is formatted as follows:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"clickhousedb://<user>:<password>@<host>:<port>/<database>[?options\u2026]clickhouse://{username}:{password}@{hostname}:{port}/{database}\n")),(0,n.kt)("p",null,"Here's a concrete example of a real connection string:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"clickhousedb://demo:demo@github.demo.trial.altinity.cloud/default?secure=true\n")),(0,n.kt)("p",null,"If you're using Clickhouse locally on your computer, you can get away with using a http protocol URL that\nuses the default user without a password (and doesn't encrypt the connection):"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"clickhousedb://localhost/default\n")))}d.isMDXComponent=!0},3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var o=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function c(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,o,n=function(e,t){if(null==e)return{};var r,o,n={},a=Object.keys(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var i=o.createContext({}),l=function(e){var t=o.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},u=function(e){var t=l(e.components);return o.createElement(i.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},k=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,i=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=l(r),k=n,f=p["".concat(i,".").concat(k)]||p[k]||d[k]||a;return r?o.createElement(f,c(c({ref:t},u),{},{components:r})):o.createElement(f,c({ref:t},u))}));function f(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,c=new Array(a);c[0]=k;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[p]="string"==typeof e?e:n,c[1]=s;for(var l=2;l<a;l++)c[l]=r[l];return o.createElement.apply(null,c)}return o.createElement.apply(null,r)}k.displayName="MDXCreateElement"}}]);