"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6318],{15680:(e,r,t)=>{t.d(r,{xA:()=>p,yg:()=>m});var n=t(96540);function a(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function i(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function o(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?i(Object(t),!0).forEach((function(r){a(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function s(e,r){if(null==e)return{};var t,n,a=function(e,r){if(null==e)return{};var t,n,a={},i=Object.keys(e);for(n=0;n<i.length;n++)t=i[n],r.indexOf(t)>=0||(a[t]=e[t]);return a}(e,r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)t=i[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var c=n.createContext({}),l=function(e){var r=n.useContext(c),t=r;return e&&(t="function"==typeof e?e(r):o(o({},r),e)),t},p=function(e){var r=l(e.components);return n.createElement(c.Provider,{value:r},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},f=n.forwardRef((function(e,r){var t=e.components,a=e.mdxType,i=e.originalType,c=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(t),f=a,m=u["".concat(c,".").concat(f)]||u[f]||d[f]||i;return t?n.createElement(m,o(o({ref:r},p),{},{components:t})):n.createElement(m,o({ref:r},p))}));function m(e,r){var t=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var i=t.length,o=new Array(i);o[0]=f;var s={};for(var c in r)hasOwnProperty.call(r,c)&&(s[c]=r[c]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var l=2;l<i;l++)o[l]=t[l];return n.createElement.apply(null,o)}return n.createElement.apply(null,t)}f.displayName="MDXCreateElement"},7209:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>p,contentTitle:()=>c,default:()=>m,frontMatter:()=>s,metadata:()=>l,toc:()=>u});var n=t(58168),a=t(98587),i=(t(96540),t(15680)),o=["components"],s={id:"druid-vs-spark",title:"Apache Druid vs Spark"},c=void 0,l={unversionedId:"comparisons/druid-vs-spark",id:"comparisons/druid-vs-spark",title:"Apache Druid vs Spark",description:"\x3c!--",source:"@site/docs/latest/comparisons/druid-vs-spark.md",sourceDirName:"comparisons",slug:"/comparisons/druid-vs-spark",permalink:"/docs/latest/comparisons/druid-vs-spark",draft:!1,tags:[],version:"current",frontMatter:{id:"druid-vs-spark",title:"Apache Druid vs Spark"}},p={},u=[],d={toc:u},f="wrapper";function m(e){var r=e.components,t=(0,a.A)(e,o);return(0,i.yg)(f,(0,n.A)({},d,t,{components:r,mdxType:"MDXLayout"}),(0,i.yg)("p",null,"Druid and Spark are complementary solutions as Druid can be used to accelerate OLAP queries in Spark."),(0,i.yg)("p",null,"Spark is a general cluster computing framework initially designed around the concept of Resilient Distributed Datasets (RDDs).\nRDDs enable data reuse by persisting intermediate results\nin memory and enable Spark to provide fast computations for iterative algorithms.\nThis is especially beneficial for certain work flows such as machine\nlearning, where the same operation may be applied over and over\nagain until some result is converged upon. The generality of Spark makes it very suitable as an engine to process (clean or transform) data.\nAlthough Spark provides the ability to query data through Spark SQL, much like Hadoop, the query latencies are not specifically targeted to be interactive (sub-second)."),(0,i.yg)("p",null,"Druid's focus is on extremely low latency queries, and is ideal for powering applications used by thousands of users, and where each query must\nreturn fast enough such that users can interactively explore through data. Druid fully indexes all data, and can act as a middle layer between Spark and your application.\nOne typical setup seen in production is to process data in Spark, and load the processed data into Druid for faster access."),(0,i.yg)("p",null,"For more information about using Druid and Spark together, including benchmarks of the two systems, please see:"),(0,i.yg)("p",null,(0,i.yg)("a",{parentName:"p",href:"https://www.linkedin.com/pulse/combining-druid-spark-interactive-flexible-analytics-scale-butani"},"https://www.linkedin.com/pulse/combining-druid-spark-interactive-flexible-analytics-scale-butani")))}m.isMDXComponent=!0}}]);