"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[2358],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function s(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var d=n.createContext({}),p=function(e){var t=n.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(d.Provider,{value:t},e.children)},l="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,d=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),l=p(a),m=r,h=l["".concat(d,".").concat(m)]||l[m]||c[m]||i;return a?n.createElement(h,o(o({ref:t},u),{},{components:a})):n.createElement(h,o({ref:t},u))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=m;var s={};for(var d in t)hasOwnProperty.call(t,d)&&(s[d]=t[d]);s.originalType=e,s[l]="string"==typeof e?e:r,o[1]=s;for(var p=2;p<i;p++)o[p]=a[p];return n.createElement.apply(null,o)}return n.createElement.apply(null,a)}m.displayName="MDXCreateElement"},838:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>d,default:()=>h,frontMatter:()=>s,metadata:()=>p,toc:()=>l});var n=a(7462),r=a(3366),i=(a(7294),a(3905)),o=["components"],s={id:"update",title:"Data updates"},d=void 0,p={unversionedId:"data-management/update",id:"data-management/update",title:"Data updates",description:"\x3c!--",source:"@site/docs/26.0.0/data-management/update.md",sourceDirName:"data-management",slug:"/data-management/update",permalink:"/docs/26.0.0/data-management/update",draft:!1,tags:[],version:"current",frontMatter:{id:"update",title:"Data updates"},sidebar:"docs",previous:{title:"Overview",permalink:"/docs/26.0.0/data-management/"},next:{title:"Data deletion",permalink:"/docs/26.0.0/data-management/delete"}},u={},l=[{value:"Overwrite",id:"overwrite",level:2},{value:"Reindex",id:"reindex",level:2},{value:"Rolled-up datasources",id:"rolled-up-datasources",level:2},{value:"Lookups",id:"lookups",level:2}],c={toc:l},m="wrapper";function h(e){var t=e.components,a=(0,r.Z)(e,o);return(0,i.kt)(m,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"overwrite"},"Overwrite"),(0,i.kt)("p",null,"Apache Druid stores data ",(0,i.kt)("a",{parentName:"p",href:"/docs/26.0.0/design/architecture#datasources-and-segments"},"partitioned by time chunk")," and supports\noverwriting existing data using time ranges. Data outside the replacement time range is not touched. Overwriting of\nexisting data is done using the same mechanisms as ",(0,i.kt)("a",{parentName:"p",href:"/docs/26.0.0/ingestion/#batch"},"batch ingestion"),"."),(0,i.kt)("p",null,"For example:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/26.0.0/ingestion/native-batch"},"Native batch")," with ",(0,i.kt)("inlineCode",{parentName:"li"},"appendToExisting: false"),", and ",(0,i.kt)("inlineCode",{parentName:"li"},"intervals")," set to a specific\ntime range, overwrites data for that time range."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/26.0.0/multi-stage-query/reference#replace"},"SQL ",(0,i.kt)("inlineCode",{parentName:"a"},"REPLACE <table> OVERWRITE [ALL | WHERE ...]"))," overwrites data for\nthe entire table or for a specified time range.")),(0,i.kt)("p",null,"In both cases, Druid's atomic update mechanism ensures that queries will flip seamlessly from the old data to the new\ndata on a time-chunk-by-time-chunk basis."),(0,i.kt)("p",null,"Ingestion and overwriting cannot run concurrently for the same time range of the same datasource. While an overwrite job\nis ongoing for a particular time range of a datasource, new ingestions for that time range are queued up. Ingestions for\nother time ranges proceed as normal. Read-only queries also proceed as normal, using the pre-existing version of the\ndata."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Druid does not support single-record updates by primary key.")),(0,i.kt)("h2",{id:"reindex"},"Reindex"),(0,i.kt)("p",null,"Reindexing is an ",(0,i.kt)("a",{parentName:"p",href:"#overwrite"},"overwrite of existing data")," where the source of new data is the existing data itself. It\nis used to perform schema changes, repartition data, filter out unwanted data, enrich existing data, and so on. This\nbehaves just like any other ",(0,i.kt)("a",{parentName:"p",href:"#overwrite"},"overwrite")," with regard to atomic updates and locking."),(0,i.kt)("p",null,"With ",(0,i.kt)("a",{parentName:"p",href:"/docs/26.0.0/ingestion/native-batch"},"native batch"),", use the ",(0,i.kt)("a",{parentName:"p",href:"/docs/26.0.0/ingestion/native-batch-input-sources#druid-input-source"},(0,i.kt)("inlineCode",{parentName:"a"},"druid")," input\nsource"),". If needed,\n",(0,i.kt)("a",{parentName:"p",href:"/docs/26.0.0/ingestion/ingestion-spec#transformspec"},(0,i.kt)("inlineCode",{parentName:"a"},"transformSpec"))," can be used to filter or modify data during the\nreindexing job."),(0,i.kt)("p",null,"With SQL, use ",(0,i.kt)("a",{parentName:"p",href:"/docs/26.0.0/multi-stage-query/reference#replace"},(0,i.kt)("inlineCode",{parentName:"a"},"REPLACE <table> OVERWRITE"))," with ",(0,i.kt)("inlineCode",{parentName:"p"},"SELECT ... FROM <table>"),".\n(Druid does not have ",(0,i.kt)("inlineCode",{parentName:"p"},"UPDATE")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"ALTER TABLE")," statements.) Any SQL SELECT query can be used to filter,\nmodify, or enrich the data during the reindexing job."),(0,i.kt)("h2",{id:"rolled-up-datasources"},"Rolled-up datasources"),(0,i.kt)("p",null,"Rolled-up datasources can be effectively updated using appends, without rewrites. When you append a row that has an\nidentical set of dimensions to an existing row, queries that use aggregation operators automatically combine those two\nrows together at query time."),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"/docs/26.0.0/data-management/compaction"},"Compaction")," or ",(0,i.kt)("a",{parentName:"p",href:"/docs/26.0.0/data-management/automatic-compaction"},"automatic compaction")," can be used to physically combine these\nmatching rows together later on, by rewriting segments in the background."),(0,i.kt)("h2",{id:"lookups"},"Lookups"),(0,i.kt)("p",null,"If you have a dimension where values need to be updated frequently, try first using ",(0,i.kt)("a",{parentName:"p",href:"/docs/26.0.0/querying/lookups"},"lookups"),". A\nclassic use case of lookups is when you have an ID dimension stored in a Druid segment, and want to map the ID dimension to a\nhuman-readable string that may need to be updated periodically."))}h.isMDXComponent=!0}}]);