"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[1548],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,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 o(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 i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",c={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,o=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=p(n),m=a,f=u["".concat(l,".").concat(m)]||u[m]||c[m]||o;return n?r.createElement(f,i(i({ref:t},d),{},{components:n})):r.createElement(f,i({ref:t},d))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:a,i[1]=s;for(var p=2;p<o;p++)i[p]=n[p];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},79505:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>f,frontMatter:()=>s,metadata:()=>p,toc:()=>u});var r=n(87462),a=n(63366),o=(n(67294),n(3905)),i=["components"],s={id:"avro",title:"Apache Avro"},l=void 0,p={unversionedId:"development/extensions-core/avro",id:"development/extensions-core/avro",title:"Apache Avro",description:"\x3c!--",source:"@site/docs/29.0.1/development/extensions-core/avro.md",sourceDirName:"development/extensions-core",slug:"/development/extensions-core/avro",permalink:"/docs/29.0.1/development/extensions-core/avro",draft:!1,tags:[],version:"current",frontMatter:{id:"avro",title:"Apache Avro"}},d={},u=[{value:"Load the Avro extension",id:"load-the-avro-extension",level:2},{value:"Avro types",id:"avro-types",level:2},{value:"Unions",id:"unions",level:3},{value:"Binary types",id:"binary-types",level:3},{value:"Enums",id:"enums",level:3},{value:"Complex types",id:"complex-types",level:3},{value:"Logical types",id:"logical-types",level:3}],c={toc:u},m="wrapper";function f(e){var t=e.components,n=(0,a.Z)(e,i);return(0,o.kt)(m,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"This Apache Druid extension enables Druid to ingest and parse the Apache Avro data format as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/docs/29.0.1/ingestion/data-formats#avro-stream"},"Avro stream input format")," for Kafka and Kinesis."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/docs/29.0.1/ingestion/data-formats#avro-ocf"},"Avro OCF input format")," for native batch ingestion."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/docs/29.0.1/ingestion/data-formats#avro-hadoop-parser"},"Avro Hadoop Parser"),".")),(0,o.kt)("p",null,"The ",(0,o.kt)("a",{parentName:"p",href:"/docs/29.0.1/ingestion/data-formats#avro-stream-parser"},"Avro Stream Parser")," is deprecated."),(0,o.kt)("h2",{id:"load-the-avro-extension"},"Load the Avro extension"),(0,o.kt)("p",null,"To use the Avro extension, add the ",(0,o.kt)("inlineCode",{parentName:"p"},"druid-avro-extensions")," to the list of loaded extensions. See ",(0,o.kt)("a",{parentName:"p",href:"/docs/29.0.1/configuration/extensions#loading-extensions"},"Loading extensions")," for more information."),(0,o.kt)("h2",{id:"avro-types"},"Avro types"),(0,o.kt)("p",null,"Druid supports most Avro types natively. This section describes some  exceptions."),(0,o.kt)("h3",{id:"unions"},"Unions"),(0,o.kt)("p",null,"Druid has two modes for supporting ",(0,o.kt)("inlineCode",{parentName:"p"},"union")," types."),(0,o.kt)("p",null,"The default mode treats unions as a single value regardless of the type of data populating the union."),(0,o.kt)("p",null,"If you want to operate on individual members of a union, set ",(0,o.kt)("inlineCode",{parentName:"p"},"extractUnionsByType")," on the Avro parser. This configuration expands union values into nested objects according to the following rules:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Primitive types and unnamed complex types are keyed by their type name, such as ",(0,o.kt)("inlineCode",{parentName:"li"},"int")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"string"),"."),(0,o.kt)("li",{parentName:"ul"},"Complex named types are keyed by their names, this includes ",(0,o.kt)("inlineCode",{parentName:"li"},"record"),", ",(0,o.kt)("inlineCode",{parentName:"li"},"fixed"),", and ",(0,o.kt)("inlineCode",{parentName:"li"},"enum"),"."),(0,o.kt)("li",{parentName:"ul"},"The Avro null type is elided as its value can only ever be null.")),(0,o.kt)("p",null,"This is safe because an Avro union can only contain a single member of each unnamed type and duplicates of the same named type are not allowed. For example, only a single array is allowed, multiple records (or other named types) are allowed as long as each has a unique name."),(0,o.kt)("p",null,"You can then access the members of the union with a ",(0,o.kt)("a",{parentName:"p",href:"/docs/29.0.1/ingestion/data-formats#flattenspec"},"flattenSpec")," like you would for other nested types."),(0,o.kt)("h3",{id:"binary-types"},"Binary types"),(0,o.kt)("p",null,"The extension returns ",(0,o.kt)("inlineCode",{parentName:"p"},"bytes")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"fixed")," Avro types as base64 encoded strings by default. To decode these types as UTF-8 strings, enable the ",(0,o.kt)("inlineCode",{parentName:"p"},"binaryAsString")," option on the Avro parser."),(0,o.kt)("h3",{id:"enums"},"Enums"),(0,o.kt)("p",null,"The extension returns ",(0,o.kt)("inlineCode",{parentName:"p"},"enum")," types as ",(0,o.kt)("inlineCode",{parentName:"p"},"string")," of the enum symbol."),(0,o.kt)("h3",{id:"complex-types"},"Complex types"),(0,o.kt)("p",null,"You can ingest ",(0,o.kt)("inlineCode",{parentName:"p"},"record")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"map")," types representing nested data with a ",(0,o.kt)("a",{parentName:"p",href:"/docs/29.0.1/ingestion/data-formats#flattenspec"},"flattenSpec")," on the parser."),(0,o.kt)("h3",{id:"logical-types"},"Logical types"),(0,o.kt)("p",null,"Druid does not currently support Avro logical types. It ignores them and handles fields according to the underlying primitive type."))}f.isMDXComponent=!0}}]);