"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6914],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});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 l(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 s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(n),m=a,f=u["".concat(s,".").concat(m)]||u[m]||d[m]||i;return n?r.createElement(f,o(o({ref:t},c),{},{components:n})):r.createElement(f,o({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:a,o[1]=l;for(var p=2;p<i;p++)o[p]=n[p];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},83208:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>f,frontMatter:()=>l,metadata:()=>p,toc:()=>u});var r=n(87462),a=n(63366),i=(n(67294),n(3905)),o=["components"],l={id:"experimental-features",title:"Experimental features"},s=void 0,p={unversionedId:"development/experimental-features",id:"development/experimental-features",title:"Experimental features",description:"\x3c!--",source:"@site/docs/27.0.0/development/experimental-features.md",sourceDirName:"development",slug:"/development/experimental-features",permalink:"/docs/27.0.0/development/experimental-features",draft:!1,tags:[],version:"current",frontMatter:{id:"experimental-features",title:"Experimental features"}},c={},u=[{value:"SQL-based ingestion",id:"sql-based-ingestion",level:2},{value:"Indexer process",id:"indexer-process",level:2},{value:"Kubernetes",id:"kubernetes",level:2},{value:"Segment locking",id:"segment-locking",level:2},{value:"Front coding",id:"front-coding",level:2},{value:"Other configuration properties",id:"other-configuration-properties",level:2}],d={toc:u},m="wrapper";function f(e){var t=e.components,n=(0,a.Z)(e,o);return(0,i.kt)(m,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"The following features are marked ",(0,i.kt)("a",{parentName:"p",href:"/docs/27.0.0/development/experimental"},"experimental")," in the Druid docs."),(0,i.kt)("p",null,"This document includes each page that mentions an experimental feature. To graduate a feature, remove all mentions of its experimental status on all relevant pages."),(0,i.kt)("p",null,"Note that this document does not track the status of contrib extensions, all of which are considered experimental."),(0,i.kt)("h2",{id:"sql-based-ingestion"},"SQL-based ingestion"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/27.0.0/multi-stage-query/"},"SQL-based ingestion")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/27.0.0/multi-stage-query/concepts"},"SQL-based ingestion concepts")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/27.0.0/api-reference/sql-ingestion-api"},"SQL-based ingestion and multi-stage query task API"))),(0,i.kt)("h2",{id:"indexer-process"},"Indexer process"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/27.0.0/design/indexer"},"Indexer process")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/27.0.0/design/processes#indexer-process-optional"},"Processes and servers"))),(0,i.kt)("h2",{id:"kubernetes"},"Kubernetes"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/27.0.0/development/extensions-core/kubernetes"},"Kubernetes"))),(0,i.kt)("h2",{id:"segment-locking"},"Segment locking"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/27.0.0/configuration/#overlord-operations"},"Configuration reference")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/27.0.0/ingestion/tasks#locking"},"Task reference")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/27.0.0/design/architecture#availability-and-consistency"},"Design"))),(0,i.kt)("h2",{id:"front-coding"},"Front coding"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/27.0.0/ingestion/ingestion-spec#front-coding"},"Ingestion spec reference"))),(0,i.kt)("h2",{id:"other-configuration-properties"},"Other configuration properties"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/27.0.0/configuration/"},"Configuration reference"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"CLOSED_SEGMENTS_SINKS")," mode"),(0,i.kt)("li",{parentName:"ul"},"Expression processing configuration ",(0,i.kt)("inlineCode",{parentName:"li"},"druid.expressions.allowNestedArrays"))))))}f.isMDXComponent=!0}}]);