[druid-user] [ANNOUNCE] Apache Druid 25.0.0 Release


The Apache Druid team wishes you all a very happy new year!

We are very excited to start the year with the release of Apache Druid 25.0.0.
Druid is a high-performance analytics data store for event-driven data.

Apache Druid 25.0.0 contains over 300 new features, bug fixes, performance enhancements, documentation improvements, and additional test coverage from 51 contributors. Some of the major highlights of this release are:

  • The new multi-stage query (MSQ) engine is now production ready
  • Nested column now supports ingestion from Avro, Parquet, ORC and other formats
  • Native ingestion on K8s without using middle managers
  • Front-coded string dictionary compression which significantly reduces segment footprint
  • New and improved Druid quickstart experience
  • Overlord improvements to support high volumes of real-time ingestion

Source and binary distributions can be downloaded from:

Release notes are at:

Thanks to all the contributors to this release.

Stay tuned for many more exciting Druid capabilities in 2023!

Kashif Faraz

import java.util.; class k_means { static int count1,count2,count3; static int d[]; static int k[][]; static int tempk[][]; static double m[]; static double diff[]; static int n,p; static int cal_diff(int a) // This method will determine the cluster in which an element go at a particular step. { int temp1=0; for(int i=0; i<p; ++i) { if(a>m[i]) diff[i]=a-m[i]; else diff[i]=m[i]-a; } int val=0; double temp=diff[0]; for(int i=0; i<p; ++i) { if(diff[i]<temp) { temp=diff[i]; val=i; } }//end of for loop return val; } static void cal_mean() // This method will determine intermediate mean values { for(int i=0; i<p; ++i) m[i]=0; // initializing means to 0 int cnt=0; for(int i=0; i<p; ++i) { cnt=0; for(int j=0; j<n-1; ++j) { if(k[i][j]!=-1) { m[i]+=k[i][j]; ++cnt; } } m[i]=m[i]/cnt; } } static int check1() // This checks if previous k ie. tempk and current k are same.Used as terminating case. { for(int i=0; i<p; ++i) for(int j=0; j<n; ++j) if(tempk[i][j]!=k[i][j]) { return 0; } return 1; } public static void main(String args[]) { Scanner scr=new Scanner(System.in); / Accepting number of elements / System.out.println("Enter the number of elements "); n=scr.nextInt(); d=new int[n]; / Accepting elements / System.out.println("Enter “+n+” elements: "); for(int i=0; i<n; ++i) d[i]=scr.nextInt(); / Accepting num of clusters / System.out.println("Enter the number of clusters: "); p=scr.nextInt(); / Initialising arrays / k=new int[p][n]; tempk=new int[p][n]; m=new double[p]; diff=new double[p]; / Initializing m */ for(int i=0; i<p; ++i) m[i]=d[i]; int temp=0; int flag=0; do { for(int i=0; i<p; ++i) for(int j=0; j<n; ++j) { k[i][j]=-1; } for(int i=0; i<n; ++i) // for loop will cal cal_diff(int) for every element. { temp=cal_diff(d[i]); if(temp==0) k[temp][count1++]=d[i]; else if(temp==1) k[temp][count2++]=d[i]; else if(temp==2) k[temp][count3++]=d[i]; } cal_mean(); // call to method which will calculate mean at this step. flag=check1(); // check if terminating condition is satisfied. if(flag!=1) /Take backup of k in tempk so that you can check for equivalence in next step/ for(int i=0; i<p; ++i) for(int j=0; j<n; ++j) tempk[i][j]=k[i][j]; System.out.println(“\n\nAt this step”); System.out.println(“\nValue of clusters”); for(int i=0; i<p; ++i) { System.out.print(“K”+(i+1)+“{ “); for(int j=0; k[i][j]!=-1 && j<n-1; ++j) System.out.print(k[i][j]+” “); System.out.println(”}”); }//end of for loop System.out.println(“\nValue of m “); for(int i=0; i<p; ++i) System.out.print(“m”+(i+1)+”=”+m[i]+" “); count1=0; count2=0; count3=0; } while(flag==0); System.out.println(”\n\n\nThe Final Clusters By Kmeans are as follows: “); for(int i=0; i<p; ++i) { System.out.print(“K”+(i+1)+”{ “); for(int j=0; k[i][j]!=-1 && j<n-1; ++j) System.out.print(k[i][j]+” “); System.out.println(”}"); } } }