(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3483],{4137:function(e,t,r){"use strict";r.d(t,{Zo:function(){return s},kt:function(){return d}});var n=r(7294);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 i(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 c(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function a(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var u=n.createContext({}),p=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},s=function(e){var t=p(e.components);return n.createElement(u.Provider,{value:t},e.children)},l={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,i=e.originalType,u=e.parentName,s=a(e,["components","mdxType","originalType","parentName"]),f=p(r),d=o,m=f["".concat(u,".").concat(d)]||f[d]||l[d]||i;return r?n.createElement(m,c(c({ref:t},s),{},{components:r})):n.createElement(m,c({ref:t},s))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,c=new Array(i);c[0]=f;var a={};for(var u in t)hasOwnProperty.call(t,u)&&(a[u]=t[u]);a.originalType=e,a.mdxType="string"==typeof e?e:o,c[1]=a;for(var p=2;p<i;p++)c[p]=r[p];return n.createElement.apply(null,c)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},2448:function(e,t,r){"use strict";r.r(t),r.d(t,{frontMatter:function(){return a},contentTitle:function(){return u},metadata:function(){return p},toc:function(){return s},default:function(){return f}});var n=r(2122),o=r(9756),i=(r(7294),r(4137)),c=["components"],a={id:"pinot-architecture",title:"Pinot Architecture",sidebar_label:"Pinot Architecture",draft:!0},u=void 0,p={unversionedId:"concepts/pinot-architecture",id:"concepts/pinot-architecture",isDocsHomePage:!1,title:"Pinot Architecture",description:"Arch",source:"@site/docs/concepts/pinot-architecture.md",sourceDirName:"concepts",slug:"/concepts/pinot-architecture",permalink:"/docs/concepts/pinot-architecture",editUrl:"https://github.com/apache/pinot/edit/master/website/docs/concepts/pinot-architecture.md",version:"current",frontMatter:{id:"pinot-architecture",title:"Pinot Architecture",sidebar_label:"Pinot Architecture",draft:!0}},s=[],l={toc:s};function f(e){var t=e.components,a=(0,o.Z)(e,c);return(0,i.kt)("wrapper",(0,n.Z)({},l,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Arch",src:r(7950).Z})),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Terminology:\nFirst, a bit of naming notions. Pinot has has different components, and different ways of representing the data. In particular, data is represented by:")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Table:\nA table is a logical abstraction to refer to a collection of related data. It consists of columns and rows (documents).")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Segment:\nData in table is divided into (horizontal) shards referred to as segments."))))}f.isMDXComponent=!0},7950:function(e,t,r){"use strict";t.Z=r.p+"assets/images/pinot-architecture-f75b926076ed34c98eb24be7ed1c1107.png"}}]);