blob: 485ad4ee90dc850fe85e08ea394d6f4eb025191f [file] [log] [blame]
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[4468],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>m});var n=r(67294);function o(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 n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(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){o(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,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),u=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=u(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(r),f=o,m=p["".concat(l,".").concat(f)]||p[f]||d[f]||a;return r?n.createElement(m,i(i({ref:t},c),{},{components:r})):n.createElement(m,i({ref:t},c))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=f;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:o,i[1]=s;for(var u=2;u<a;u++)i[u]=r[u];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},11628:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>u,toc:()=>p});var n=r(87462),o=r(63366),a=(r(67294),r(3905)),i=["components"],s={id:"joins",title:"Joins"},l=void 0,u={unversionedId:"querying/joins",id:"querying/joins",title:"Joins",description:"\x3c!--",source:"@site/docs/latest/querying/joins.md",sourceDirName:"querying",slug:"/querying/joins",permalink:"/docs/latest/querying/joins",draft:!1,tags:[],version:"current",frontMatter:{id:"joins",title:"Joins"},sidebar:"docs",previous:{title:"Datasources",permalink:"/docs/latest/querying/datasource"},next:{title:"Lookups",permalink:"/docs/latest/querying/lookups"}},c={},p=[],d={toc:p},f="wrapper";function m(e){var t=e.components,r=(0,o.Z)(e,i);return(0,a.kt)(f,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"Apache Druid has two features related to joining of data:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("a",{parentName:"li",href:"/docs/latest/querying/datasource#join"},"Join")," operators. These are available using a ",(0,a.kt)("a",{parentName:"li",href:"/docs/latest/querying/datasource#join"},"join datasource")," in native\nqueries, or using the ",(0,a.kt)("a",{parentName:"li",href:"/docs/latest/querying/sql"},"JOIN operator")," in Druid SQL. Refer to the\n",(0,a.kt)("a",{parentName:"li",href:"/docs/latest/querying/datasource#join"},"join datasource")," documentation for information about how joins work in Druid native queries,\nor the ",(0,a.kt)("a",{parentName:"li",href:"/docs/latest/multi-stage-query/reference#joins"},"multi-stage query join documentation")," for information about how joins\nwork in multi-stage query tasks."),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("a",{parentName:"li",href:"/docs/latest/querying/lookups"},"Query-time lookups"),", simple key-to-value mappings. These are preloaded on all servers that are involved\nin queries and can be accessed with or without an explicit join operator. Refer to the ",(0,a.kt)("a",{parentName:"li",href:"/docs/latest/querying/lookups"},"lookups"),"\ndocumentation for more details.")),(0,a.kt)("p",null,"Whenever possible, for best performance it is good to avoid joins at query time. Often this can be accomplished by\njoining data before it is loaded into Druid. However, there are situations where joins or lookups are the best solution\navailable despite the performance overhead, including:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The fact-to-dimension (star and snowflake schema) case: you need to change dimension values after initial ingestion,\nand aren't able to reingest to do this. In this case, you can use lookups for your dimension tables."),(0,a.kt)("li",{parentName:"ul"},"Your workload requires joins or filters on subqueries.")))}m.isMDXComponent=!0}}]);