"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7341],{4137:function(e,t,n){n.d(t,{Zo:function(){return c},kt:function(){return f}});var r=n(7294);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 u=r.createContext({}),l=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=l(e.components);return r.createElement(u.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=l(n),f=a,m=d["".concat(u,".").concat(f)]||d[f]||p[f]||o;return n?r.createElement(m,i(i({ref:t},c),{},{components:n})):r.createElement(m,i({ref:t},c))}));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]=d;var s={};for(var u in t)hasOwnProperty.call(t,u)&&(s[u]=t[u]);s.originalType=e,s.mdxType="string"==typeof e?e:a,i[1]=s;for(var l=2;l<o;l++)i[l]=n[l];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},1588:function(e,t,n){n.r(t),n.d(t,{frontMatter:function(){return s},contentTitle:function(){return u},metadata:function(){return l},toc:function(){return c},default:function(){return d}});var r=n(7462),a=n(3366),o=(n(7294),n(4137)),i=["components"],s={id:"features_of_pinot",title:"Features of Pinot",sidebar_label:"Features of Pinot",draft:!0},u="Features of Pinot",l={unversionedId:"about/features_of_pinot",id:"about/features_of_pinot",isDocsHomePage:!1,title:"Features of Pinot",description:"- A column-oriented database with various compression schemes such as Run Length, Fixed Bit Length",source:"@site/docs/about/features_of_pinot.md",sourceDirName:"about",slug:"/about/features_of_pinot",permalink:"/docs/about/features_of_pinot",editUrl:"https://github.com/apache/pinot/edit/master/website/docs/about/features_of_pinot.md",version:"current",frontMatter:{id:"features_of_pinot",title:"Features of Pinot",sidebar_label:"Features of Pinot",draft:!0},sidebar:"docs",previous:{title:"What is Pinot",permalink:"/docs/about/what_is_pinot"},next:{title:"Running Pinot locally",permalink:"/docs/administration/running_locally"}},c=[],p={toc:c};function d(e){var t=e.components,n=(0,a.Z)(e,i);return(0,o.kt)("wrapper",(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"features-of-pinot"},"Features of Pinot"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"A column-oriented database with various compression schemes such as Run Length, Fixed Bit Length"),(0,o.kt)("li",{parentName:"ul"},"Pluggable indexing technologies - Sorted Index, Bitmap Index, Inverted Index"),(0,o.kt)("li",{parentName:"ul"},"Ability to optimize query/execution plan based on query and segment metadata ."),(0,o.kt)("li",{parentName:"ul"},"Near real time ingestion from streams and batch ingestion from Hadoop"),(0,o.kt)("li",{parentName:"ul"},"SQL like language that supports selection, aggregation, filtering, group by, order by, distinct queries on data."),(0,o.kt)("li",{parentName:"ul"},"Support for multivalued fields"),(0,o.kt)("li",{parentName:"ul"},"Horizontally scalable and fault tolerant")),(0,o.kt)("p",null,"Because of the design choices we made to achieve these goals, there are certain limitations in Pinot:"),(0,o.kt)("p",null,"Pinot is not a replacement for database i.e it cannot be used as source of truth store, cannot mutate data\nNot a replacement for search engine i.e Full text search, relevance not supported\nQuery cannot span across multiple tables.\nPinot works very well for querying time series data with lots of Dimensions and Metrics. ",(0,o.kt)("br",null)),(0,o.kt)("p",null,"For example:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-SQL"},"SELECT sum(clicks), sum(impressions) FROM AdAnalyticsTable\n  WHERE ((daysSinceEpoch >= 17849 AND daysSinceEpoch <= 17856)) AND accountId IN (123456789)\n  GROUP BY daysSinceEpoch TOP 100\n")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-SQL"},"SELECT sum(impressions) FROM AdAnalyticsTable\n  WHERE (daysSinceEpoch >= 17824 and daysSinceEpoch <= 17854) AND adveriserId = '1234356789'\n  GROUP BY daysSinceEpoch,advertiserId TOP 100\n")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-SQL"},"SELECT sum(cost) FROM AdAnalyticsTable GROUP BY advertiserId TOP 50\n")))}d.isMDXComponent=!0}}]);