From 0d5866f449fd467cf92015df0632b64fffda9644 Mon Sep 17 00:00:00 2001 From: Bruce Ritchie Date: Thu, 20 Feb 2025 12:28:28 -0500 Subject: [PATCH 01/14] DF 45 blog post --- content/blog/2025-02-20-datafusion-45.0.0.md | 300 ++++++++++++++++++ .../performance_over_time.png | Bin 0 -> 52136 bytes 2 files changed, 300 insertions(+) create mode 100644 content/blog/2025-02-20-datafusion-45.0.0.md create mode 100644 content/images/datafusion-45.0.0/performance_over_time.png diff --git a/content/blog/2025-02-20-datafusion-45.0.0.md b/content/blog/2025-02-20-datafusion-45.0.0.md new file mode 100644 index 0000000..53170c0 --- /dev/null +++ b/content/blog/2025-02-20-datafusion-45.0.0.md @@ -0,0 +1,300 @@ +--- +layout: post +title: Apache DataFusion 45.0.0 Released +date: 2025-02-20 +categories: [release] +--- + + + + + +## Introduction + +We are very proud to announce [DataFusion 45.0.0]. This blog highlights some of the +many major improvements since we released [DataFusion 40.0.0] and a preview of +what the community is thinking about in the next 6 months. It has been an exciting +period of development for DataFusion! + +[DataFusion 40.0.0]: https://datafusion.apache.org/blog/2024/07/24/datafusion-40.0.0/ +[DataFusion 45.0.0]: https://crates.io/crates/datafusion/45.0.0 + +[Apache DataFusion] is an extensible query engine, written in [Rust], that +uses [Apache Arrow] as its in-memory format. DataFusion is used by developers to +create new, fast data centric systems such as databases, dataframe libraries, +machine learning and streaming applications. While [DataFusion’s primary design +goal] is to accelerate the creation of other data centric systems, it has a +reasonable experience directly out of the box as a [dataframe library], +[python library] and [command line SQL tool]. + +[apache datafusion]: https://datafusion.apache.org/ +[rust]: https://www.rust-lang.org/ +[apache arrow]: https://arrow.apache.org +[DataFusion’s primary design goal]: https://datafusion.apache.org/user-guide/introduction.html#project-goals +[dataframe library]: https://datafusion.apache.org/user-guide/dataframe.html +[python library]: https://datafusion.apache.org/python/ +[command line SQL tool]: https://datafusion.apache.org/user-guide/cli/ + +DataFusion's core thesis is that as a community, together we can build much more +advanced technology than any of us as individuals or companies could do alone. +Without DataFusion, highly performant vectorized query engines would remain +the domain of a few large companies and world-class research institutions. +With DataFusion, we can all build on top of a shared foundation, and focus on +what makes our projects unique. + + +## Community Growth πŸ“ˆ + +In the last 6 months, between `40.0.0` and `45.0.0`, our community continues to +grow in new and exciting ways. + +1. We added several PMC members and new committers: [@jayzhan211] and [@jonahgoa] joined the PMC, + [@2010YOUY01], [@rachelint], [@findpi], [@iffyio], [@goldmedal], [@Weijun-H], [@Michael-J-Ward] and [@korowa] + joined as committers. See the [mailing list] for more details. +2. In the [core DataFusion repo] alone we reviewed and accepted almost 1600 PRs from 206 different + committers, created over 1100 issues and closed 751 of them πŸš€. All changes are listed in the detailed + [changelogs]. +3. DataFusion focused meetups happened in multiple cities around the world: [Hangzhou], [Belgrade], [New York], + [Seattle], [Chicago], [Boston] and [Amsterdam] as well as a Rust NYC meetup in NYC focussed on DataFusion. + +[core DataFusion repo]: https://github.com/apache/arrow-datafusion +[changelogs]: https://github.com/apache/datafusion/tree/main/dev/changelog +[mailing list]: https://lists.apache.org/list.html?dev@datafusion.apache.org +[Hangzhou]: https://github.com/apache/datafusion/discussions/10341#discussioncomment-10110273 +[Belgrade]: https://github.com/apache/datafusion/discussions/11431 +[New York]: https://github.com/apache/datafusion/discussions/11213 +[Seattle]: https://github.com/apache/datafusion/discussions/10348 +[Chicago]: https://github.com/apache/datafusion/discussions/12894 +[Boston]: https://github.com/apache/datafusion/discussions/13165 +[Amsterdam]: https://github.com/apache/datafusion/discussions/12988 + + + +DataFusion has put in an application to be part of [Google Summer of Code] with a +[number of ideas] for projects with mentors already selected. Additionally, [some ideas] on +how to make DataFusion an ideal selection for university database projects such as the +[CMU database classes] have been put forward. + +[Google Summer of Code]: https://summerofcode.withgoogle.com/ +[number of ideas]: https://github.com/apache/datafusion/issues/14478 +[some ideas]: https://github.com/apache/datafusion/issues/14373 +[CMU database classes]: https://15445.courses.cs.cmu.edu/spring2025/ + +In addition, DataFusion has been appearing publicly more and more, both online and offline. Here are some highlights: + +1. A [demonstration of how uwheel] is integrated into DataFusion +2. Integrating StringView into DataFusion - [part 1] and [part 2] +3. [Building streams] with DataFusion +4. [Caching in DataFusion]: Don't read twice +5. [Parquet pruning in DataFusion]: Read no more than you need +6. [DataFusion is one of the 10 coolest] open source software tools +7. [Building databases over a weekend] + +[demonstration of how uwheel]: https://uwheel.rs/post/datafusion_uwheel/ +[part 1]: https://www.influxdata.com/blog/faster-queries-with-stringview-part-one-influxdb/ +[part 2]: https://www.influxdata.com/blog/faster-queries-with-stringview-part-two-influxdb/ +[Building streams]: https://techontherocks.show/3 +[Caching in DataFusion]: https://blog.haoxp.xyz/posts/caching-datafusion +[Parquet pruning in DataFusion]: https://blog.haoxp.xyz/posts/parquet-to-arrow/ +[DataFusion is one of the 10 coolest]: https://www.crn.com/news/software/2024/the-10-coolest-open-source-software-tools-of-2024?page=3 +[Building databases over a weekend]: https://www.denormalized.io/blog/building-databases + +## Improved Performance πŸš€ + +DataFusion hit a milestone in its development by becoming [the fastest single node engine] +for querying Apache Parquet files in [clickbench] benchmark for the 43.0.0 release. A lot +of work went into making this happen! + + + +**Figure 1**: ClickBench performance improved over 33% between DataFusion 33 +(released Nov. 2023) and DataFusion 45 (released Feb. 2025). + +The task of [integrating] the new [Arrow StringView] which significantly improves performance +for workloads that scan, filter and group by variable length string and binary data was completed +and enabled by default in the past 6 months. The improvement is especially pronounced for Parquet +files due to [upstream work in the parquet reader]. Kudos to [@XiangpengHong], [@AriesDevil], +[@PsiACE], [@Weijun-H], [@a10y], and [@RinChanNOWWW] for driving this project. + +[the fastest single node engine]: https://datafusion.apache.org/blog/2024/11/18/datafusion-fastest-single-node-parquet-clickbench/ +[clickbench]: https://benchmark.clickhouse.com/ +[integrating]: https://github.com/apache/datafusion/issues/10918 +[Arrow StringView]: https://docs.rs/arrow/latest/arrow/array/struct.GenericByteViewArray.html +[multiple variable length columns in the `GROUP BY` clause]: https://github.com/apache/datafusion/issues/9403 +[upstream work in the parquet reader]: https://github.com/apache/arrow-rs/issues/5530 + +## Improved Quality πŸ“‹ + +DataFusion continues to improve overall in quality. In addition to ongoing bug +fixes, one of the most exciting improvements in the last 6 months was the addition of the +[SQLite sqllogictest suite] thanks to [@Omega359]. These tests run over 5 million +sql statements on every push to the main branch. + +Support for [explicitly checking logical plan invariants] was added by [@wiedld] which +can help catch implicit changes that might cause problems during upgrades. + +[SQLite sqllogictest suite]: https://github.com/apache/datafusion/pull/13936 +[explicitly checking logical plan invariants]: https://github.com/apache/datafusion/pull/13651 + +## Improved Documentation πŸ“š + +We continue to improve the documentation to make it easier to get started using DataFusion. +During the last 6 months two projects were initiated to migrate the function documentation +from strictly static markdown files. First, [@Omega359] [created a framework] to allow function +documentation to be generated from code and [@jonathanc-n] and others helped with the migration, +then [@comphead] lead a project to [create a doc macro] to allow for an even easier way to write +function documentation. A special thanks to [@Chen-Yuan-Lai] for migrating many functions to +the new syntax. + +[created a framework]: https://github.com/apache/datafusion/pull/12668 +[create a doc macro]: https://github.com/apache/datafusion/pull/12822 + +Additionally, the [examples] were [refactored] and [cleaned up] to improve their usefulness. + +[examples]: https://github.com/apache/datafusion/pull/13877 +[refactored]: https://github.com/apache/datafusion/pull/13905 +[cleaned up]: https://github.com/apache/datafusion/pull/13950 + +## New Features ✨ + +There are too many new features in the last 6 months to list them all, but here +are some highlights: + +### Functions +* Window functions were migrated from BuiltInWindowFunctions to UDFs ([@jcsherin]) +* Aggregate functions were migrated from builtin functions to UDFs +* As mentioned above function documentation was extracted from the markdown files +* Some new functions and sql support were added including '[show functions]', '[to_local_time]', + '[regexp_count]', '[map_extract]', '[array_distance]', '[array_any_value]', '[greatest]', + '[least]', '[arrays_overlap]' + +### FFI +* Foreign Function Interface work has started. This should allow for + [using table providers] across languages and versions of DataFusion. This + is especially pertinent for integration with [delta-rs] and other table formats. + +[delta-rs]: https://delta-io.github.io/delta-rs/ + +### Materialized Views +* [@suremarc] has added a [materialized view implementation] in datafusion-contrib πŸš€ + +### Substrait +* A lot of work was put into improving and enhancing substrait support ([@Blizzara], [@westonpace], [@tokoko], [@vbarua], [@LatrecheYasser], [@notfilippo] and others) + +[show functions]: https://github.com/apache/datafusion/pull/13799 +[to_local_time]: https://github.com/apache/datafusion/pull/11347 +[regexp_count]: https://github.com/apache/datafusion/pull/12970 +[map_extract]: https://github.com/apache/datafusion/pull/11969 +[array_distance]: https://github.com/apache/datafusion/pull/12211 +[array_any_value]: https://github.com/apache/datafusion/pull/12329 +[greatest]: https://github.com/apache/datafusion/pull/12474 +[least]: https://github.com/apache/datafusion/pull/13786 +[arrays_overlap]: https://github.com/apache/datafusion/pull/14217 +[using table providers]: https://github.com/apache/datafusion/pull/12920 +[materialized view implementation]: https://github.com/datafusion-contrib/datafusion-materialized-views + +## Looking Ahead: The Next Six Months πŸ”­ + +One of the long term goals of [@alamb], DataFusion's PMC chair, has been to have +[1000 DataFusion based projects]. This may be the year that happens! + +The community has been [discussing what we will work on in the next six months]. +Some major initiatives are likely to be: + +1. *Performance*: A [number of items have been identified] as areas that could use additional work +2. *Memory usage*: Tracking and improving memory usage, statistics and spilling to disk +3. *GSOC*: DataFusion is hopefully selected as a project and we start accepting and supporting student projects +4. *FFI*: Extending the FFI implementation to support to all types of UDF's and SessionContext + +[1000 DataFusion based projects]: https://www.influxdata.com/blog/datafusion-2025-influxdb/ +[discussing what we will work on in the next six months]: https://github.com/apache/datafusion/issues/14580 +[number of items have been identified]: https://github.com/apache/datafusion/issues/14482 + +## How to Get Involved + +DataFusion is not a project built or driven by a single person, company, or +foundation. Rather, our community of users and contributors work together to +build a shared technology that none of us could have built alone. + +If you are interested in joining us we would love to have you. You can try out +DataFusion on some of your own data and projects and let us know how it goes, +contribute suggestions, documentation, bug reports, or a PR with documentation, +tests or code. A list of open issues suitable for beginners is [here] and you +can find how to reach us on the [communication doc]. + +[here]: https://github.com/apache/arrow-datafusion/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22 +[communication doc]: https://datafusion.apache.org/contributor-guide/communication.html + +[@jayzhan211]: https://github.com/jayzhan211 +[@jonahgoa]: https://github.com/jonahgao +[@2010YOUY01]: https://github.com/2010YOUY01 +[@rachelint]: https://github.com/rachelint +[@findpi]: https://github.com/findepi/ +[@iffyio]: https://github.com/iffyio +[@goldmedal]: https://github.com/goldmedal +[@Weijun-H]: https://github.com/Weijun-H +[@Michael-J-Ward]: https://github.com/Michael-J-Ward +[@korowa]: https://github.com/korowa +[@Omega359]: https://github.com/Omega359 +[@jonathanc-n]: https://github.com/jonathanc-n +[@comphead]: https://github.com/comphead +[@Chen-Yuan-Lai]: https://github.com/Chen-Yuan-Lai +[@alamb]: https://github.com/alamb +[@Blizzara]: https://github.com/Blizzara +[@westonpace]: https://github.com/westonpace +[@tokoko]: https://github.com/tokoko +[@vbarua]: https://github.com/vbarua +[@LatrecheYasser]: https://github.com/LatrecheYasser +[@notfilippo]: https://github.com/notfilippo +[@suremarc]: https://github.com/suremarc +[@XiangpengHong]: https://github.com/XiangpengHong +[@AriesDevil]: https://github.com/AriesDevil +[@PsiACE]: https://github.com/PsiACE +[@a10y]: https://github.com/a10y +[@RinChanNOWWW]: https://github.com/RinChanNOWWW +[@wiedld]: https://github.com/wiedld +[@jcsherin]: https://github.com/jcsherin \ No newline at end of file diff --git a/content/images/datafusion-45.0.0/performance_over_time.png b/content/images/datafusion-45.0.0/performance_over_time.png new file mode 100644 index 0000000000000000000000000000000000000000..dc899faf7814d64def8189dfde2486a97bd2f666 GIT binary patch literal 52136 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 z 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 U<{ Date: Fri, 21 Feb 2025 08:58:30 -0500 Subject: [PATCH 02/14] Update content/blog/2025-02-20-datafusion-45.0.0.md Co-authored-by: Yongting You <2010youy01@gmail.com> --- content/blog/2025-02-20-datafusion-45.0.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2025-02-20-datafusion-45.0.0.md b/content/blog/2025-02-20-datafusion-45.0.0.md index 53170c0..36d0a28 100644 --- a/content/blog/2025-02-20-datafusion-45.0.0.md +++ b/content/blog/2025-02-20-datafusion-45.0.0.md @@ -126,7 +126,7 @@ In addition, DataFusion has been appearing publicly more and more, both online a 3. [Building streams] with DataFusion 4. [Caching in DataFusion]: Don't read twice 5. [Parquet pruning in DataFusion]: Read no more than you need -6. [DataFusion is one of the 10 coolest] open source software tools +6. DataFusion is one of [The 10 coolest open source software tools] 7. [Building databases over a weekend] [demonstration of how uwheel]: https://uwheel.rs/post/datafusion_uwheel/ From 37996097c502364ce9e7c3dbad56d385473c6f52 Mon Sep 17 00:00:00 2001 From: Bruce Ritchie Date: Fri, 21 Feb 2025 08:58:37 -0500 Subject: [PATCH 03/14] Update content/blog/2025-02-20-datafusion-45.0.0.md Co-authored-by: Yongting You <2010youy01@gmail.com> --- content/blog/2025-02-20-datafusion-45.0.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2025-02-20-datafusion-45.0.0.md b/content/blog/2025-02-20-datafusion-45.0.0.md index 36d0a28..40b6044 100644 --- a/content/blog/2025-02-20-datafusion-45.0.0.md +++ b/content/blog/2025-02-20-datafusion-45.0.0.md @@ -135,7 +135,7 @@ In addition, DataFusion has been appearing publicly more and more, both online a [Building streams]: https://techontherocks.show/3 [Caching in DataFusion]: https://blog.haoxp.xyz/posts/caching-datafusion [Parquet pruning in DataFusion]: https://blog.haoxp.xyz/posts/parquet-to-arrow/ -[DataFusion is one of the 10 coolest]: https://www.crn.com/news/software/2024/the-10-coolest-open-source-software-tools-of-2024?page=3 +[The 10 coolest open source software tools]: https://www.crn.com/news/software/2024/the-10-coolest-open-source-software-tools-of-2024?page=3 [Building databases over a weekend]: https://www.denormalized.io/blog/building-databases ## Improved Performance πŸš€ From 88d7b6bf54e5310a716e9ea97cb644119fee1f26 Mon Sep 17 00:00:00 2001 From: Bruce Ritchie Date: Sat, 22 Feb 2025 08:19:38 -0500 Subject: [PATCH 04/14] Set author to PMC. --- content/blog/2025-02-20-datafusion-45.0.0.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/blog/2025-02-20-datafusion-45.0.0.md b/content/blog/2025-02-20-datafusion-45.0.0.md index 40b6044..665a99c 100644 --- a/content/blog/2025-02-20-datafusion-45.0.0.md +++ b/content/blog/2025-02-20-datafusion-45.0.0.md @@ -2,6 +2,7 @@ layout: post title: Apache DataFusion 45.0.0 Released date: 2025-02-20 +author: pmc categories: [release] --- From 5a13332a56813dc69576b3099f0a95d69708d990 Mon Sep 17 00:00:00 2001 From: Bruce Ritchie Date: Sat, 22 Feb 2025 08:30:38 -0500 Subject: [PATCH 05/14] Set author to PMC, incorporated feedback. --- content/blog/2025-02-20-datafusion-45.0.0.md | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/content/blog/2025-02-20-datafusion-45.0.0.md b/content/blog/2025-02-20-datafusion-45.0.0.md index 665a99c..ee9c7ed 100644 --- a/content/blog/2025-02-20-datafusion-45.0.0.md +++ b/content/blog/2025-02-20-datafusion-45.0.0.md @@ -142,8 +142,10 @@ In addition, DataFusion has been appearing publicly more and more, both online a ## Improved Performance πŸš€ DataFusion hit a milestone in its development by becoming [the fastest single node engine] -for querying Apache Parquet files in [clickbench] benchmark for the 43.0.0 release. A lot -of work went into making this happen! +for querying Apache Parquet files in [clickbench] benchmark for the 43.0.0 release. A [lot +of work] went into making this happen! While other engines have subsequently gotten faster, +displacing DataFusion from the top spot, DataFusion is remains near the top and we [are planing +more improvements]. Date: Sat, 22 Feb 2025 08:31:24 -0500 Subject: [PATCH 06/14] Update content/blog/2025-02-20-datafusion-45.0.0.md Co-authored-by: Andrew Lamb --- content/blog/2025-02-20-datafusion-45.0.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2025-02-20-datafusion-45.0.0.md b/content/blog/2025-02-20-datafusion-45.0.0.md index ee9c7ed..b87f9e4 100644 --- a/content/blog/2025-02-20-datafusion-45.0.0.md +++ b/content/blog/2025-02-20-datafusion-45.0.0.md @@ -25,7 +25,7 @@ limitations under the License. {% endcomment %} --> - + ## Introduction From 8a4620021bf72e40deafec23b466486ac100bf4b Mon Sep 17 00:00:00 2001 From: Bruce Ritchie Date: Sat, 22 Feb 2025 08:36:24 -0500 Subject: [PATCH 07/14] expanded GSOC as it may not be obvious what it is and linked it up. --- content/blog/2025-02-20-datafusion-45.0.0.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/blog/2025-02-20-datafusion-45.0.0.md b/content/blog/2025-02-20-datafusion-45.0.0.md index b87f9e4..964fc3f 100644 --- a/content/blog/2025-02-20-datafusion-45.0.0.md +++ b/content/blog/2025-02-20-datafusion-45.0.0.md @@ -259,12 +259,13 @@ Some major initiatives are likely to be: 1. *Performance*: A [number of items have been identified] as areas that could use additional work 2. *Memory usage*: Tracking and improving memory usage, statistics and spilling to disk -3. *GSOC*: DataFusion is hopefully selected as a project and we start accepting and supporting student projects +3. *[Google Summer of Code] (GSOC)*: DataFusion is hopefully selected as a project and we start accepting and supporting student projects 4. *FFI*: Extending the FFI implementation to support to all types of UDF's and SessionContext [1000 DataFusion based projects]: https://www.influxdata.com/blog/datafusion-2025-influxdb/ [discussing what we will work on in the next six months]: https://github.com/apache/datafusion/issues/14580 [number of items have been identified]: https://github.com/apache/datafusion/issues/14482 +[Google Summer of Code]: https://summerofcode.withgoogle.com/ ## How to Get Involved From 5460e1a028ec9136fac4254ee03b4e0755d9e7d8 Mon Sep 17 00:00:00 2001 From: Bruce Ritchie Date: Sat, 22 Feb 2025 12:27:09 -0500 Subject: [PATCH 08/14] Grammar fix. --- content/blog/2025-02-20-datafusion-45.0.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2025-02-20-datafusion-45.0.0.md b/content/blog/2025-02-20-datafusion-45.0.0.md index 964fc3f..2a6331f 100644 --- a/content/blog/2025-02-20-datafusion-45.0.0.md +++ b/content/blog/2025-02-20-datafusion-45.0.0.md @@ -144,7 +144,7 @@ In addition, DataFusion has been appearing publicly more and more, both online a DataFusion hit a milestone in its development by becoming [the fastest single node engine] for querying Apache Parquet files in [clickbench] benchmark for the 43.0.0 release. A [lot of work] went into making this happen! While other engines have subsequently gotten faster, -displacing DataFusion from the top spot, DataFusion is remains near the top and we [are planing +displacing DataFusion from the top spot, DataFusion still remains near the top and we [are planing more improvements]. Date: Sat, 22 Feb 2025 12:28:05 -0500 Subject: [PATCH 09/14] Typo fix --- content/blog/2025-02-20-datafusion-45.0.0.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/blog/2025-02-20-datafusion-45.0.0.md b/content/blog/2025-02-20-datafusion-45.0.0.md index 2a6331f..72b3ff2 100644 --- a/content/blog/2025-02-20-datafusion-45.0.0.md +++ b/content/blog/2025-02-20-datafusion-45.0.0.md @@ -144,7 +144,7 @@ In addition, DataFusion has been appearing publicly more and more, both online a DataFusion hit a milestone in its development by becoming [the fastest single node engine] for querying Apache Parquet files in [clickbench] benchmark for the 43.0.0 release. A [lot of work] went into making this happen! While other engines have subsequently gotten faster, -displacing DataFusion from the top spot, DataFusion still remains near the top and we [are planing +displacing DataFusion from the top spot, DataFusion still remains near the top and we [are planning more improvements]. Date: Sat, 22 Feb 2025 12:30:39 -0500 Subject: [PATCH 10/14] Typo fix --- content/blog/2025-02-20-datafusion-45.0.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2025-02-20-datafusion-45.0.0.md b/content/blog/2025-02-20-datafusion-45.0.0.md index 72b3ff2..4120b27 100644 --- a/content/blog/2025-02-20-datafusion-45.0.0.md +++ b/content/blog/2025-02-20-datafusion-45.0.0.md @@ -218,7 +218,7 @@ are some highlights: ### Functions * Uniform Window Functions: `BuiltInWindowFunctions` was removed and all now use UDFs ([@jcsherin]) -* Uniform Aggregate Functions: `BuiltInAggregateFunctions` was removed and all now used UDFs +* Uniform Aggregate Functions: `BuiltInAggregateFunctions` was removed and all now use UDFs * As mentioned above function documentation was extracted from the markdown files * Some new functions and sql support were added including '[show functions]', '[to_local_time]', '[regexp_count]', '[map_extract]', '[array_distance]', '[array_any_value]', '[greatest]', From 7bb8713a424ea4cf0ac23df87090c0eeb0773f41 Mon Sep 17 00:00:00 2001 From: Bruce Ritchie Date: Sat, 22 Feb 2025 12:42:44 -0500 Subject: [PATCH 11/14] Adding spark functions to looking ahead section --- content/blog/2025-02-20-datafusion-45.0.0.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/blog/2025-02-20-datafusion-45.0.0.md b/content/blog/2025-02-20-datafusion-45.0.0.md index 4120b27..a8a190b 100644 --- a/content/blog/2025-02-20-datafusion-45.0.0.md +++ b/content/blog/2025-02-20-datafusion-45.0.0.md @@ -261,11 +261,13 @@ Some major initiatives are likely to be: 2. *Memory usage*: Tracking and improving memory usage, statistics and spilling to disk 3. *[Google Summer of Code] (GSOC)*: DataFusion is hopefully selected as a project and we start accepting and supporting student projects 4. *FFI*: Extending the FFI implementation to support to all types of UDF's and SessionContext +5. *Spark Functions*: A [proposal has been made to add a crate] covering spark builtin functions [1000 DataFusion based projects]: https://www.influxdata.com/blog/datafusion-2025-influxdb/ [discussing what we will work on in the next six months]: https://github.com/apache/datafusion/issues/14580 [number of items have been identified]: https://github.com/apache/datafusion/issues/14482 [Google Summer of Code]: https://summerofcode.withgoogle.com/ +[proposal has been made to add a crate]: https://github.com/apache/datafusion/issues/5600 ## How to Get Involved From b33052370ae6e5661132eca9e269e528976acaa1 Mon Sep 17 00:00:00 2001 From: Bruce Ritchie Date: Sat, 22 Feb 2025 12:43:59 -0500 Subject: [PATCH 12/14] minor change --- content/blog/2025-02-20-datafusion-45.0.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2025-02-20-datafusion-45.0.0.md b/content/blog/2025-02-20-datafusion-45.0.0.md index a8a190b..f0fd870 100644 --- a/content/blog/2025-02-20-datafusion-45.0.0.md +++ b/content/blog/2025-02-20-datafusion-45.0.0.md @@ -261,7 +261,7 @@ Some major initiatives are likely to be: 2. *Memory usage*: Tracking and improving memory usage, statistics and spilling to disk 3. *[Google Summer of Code] (GSOC)*: DataFusion is hopefully selected as a project and we start accepting and supporting student projects 4. *FFI*: Extending the FFI implementation to support to all types of UDF's and SessionContext -5. *Spark Functions*: A [proposal has been made to add a crate] covering spark builtin functions +5. *Spark Functions*: A [proposal has been made to add a crate] covering spark compatible builtin functions [1000 DataFusion based projects]: https://www.influxdata.com/blog/datafusion-2025-influxdb/ [discussing what we will work on in the next six months]: https://github.com/apache/datafusion/issues/14580 From 3b9b11dbefecb5b5f0a0253dfb0795fbe4af6a68 Mon Sep 17 00:00:00 2001 From: Bruce Ritchie Date: Mon, 24 Feb 2025 09:51:20 -0500 Subject: [PATCH 13/14] Fixed Jonah Gao's handle. --- content/blog/2025-02-20-datafusion-45.0.0.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/blog/2025-02-20-datafusion-45.0.0.md b/content/blog/2025-02-20-datafusion-45.0.0.md index f0fd870..0d07e62 100644 --- a/content/blog/2025-02-20-datafusion-45.0.0.md +++ b/content/blog/2025-02-20-datafusion-45.0.0.md @@ -66,7 +66,7 @@ what makes our projects unique. In the last 6 months, between `40.0.0` and `45.0.0`, our community continues to grow in new and exciting ways. -1. We added several PMC members and new committers: [@jayzhan211] and [@jonahgoa] joined the PMC, +1. We added several PMC members and new committers: [@jayzhan211] and [@jonahgao] joined the PMC, [@2010YOUY01], [@rachelint], [@findpi], [@iffyio], [@goldmedal], [@Weijun-H], [@Michael-J-Ward] and [@korowa] joined as committers. See the [mailing list] for more details. 2. In the [core DataFusion repo] alone we reviewed and accepted almost 1600 PRs from 206 different @@ -285,7 +285,7 @@ can find how to reach us on the [communication doc]. [communication doc]: https://datafusion.apache.org/contributor-guide/communication.html [@jayzhan211]: https://github.com/jayzhan211 -[@jonahgoa]: https://github.com/jonahgao +[@jonahgao]: https://github.com/jonahgao [@2010YOUY01]: https://github.com/2010YOUY01 [@rachelint]: https://github.com/rachelint [@findpi]: https://github.com/findepi/ From 29af56649aee4c35a6d491fd4472cab10b94508e Mon Sep 17 00:00:00 2001 From: Andrew Lamb Date: Mon, 24 Feb 2025 20:16:54 -0500 Subject: [PATCH 14/14] Update content/blog/2025-02-20-datafusion-45.0.0.md Co-authored-by: Phillip LeBlanc --- content/blog/2025-02-20-datafusion-45.0.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2025-02-20-datafusion-45.0.0.md b/content/blog/2025-02-20-datafusion-45.0.0.md index 0d07e62..b9bd1df 100644 --- a/content/blog/2025-02-20-datafusion-45.0.0.md +++ b/content/blog/2025-02-20-datafusion-45.0.0.md @@ -73,7 +73,7 @@ grow in new and exciting ways. committers, created over 1100 issues and closed 751 of them πŸš€. All changes are listed in the detailed [changelogs]. 3. DataFusion focused meetups happened in multiple cities around the world: [Hangzhou], [Belgrade], [New York], - [Seattle], [Chicago], [Boston] and [Amsterdam] as well as a Rust NYC meetup in NYC focussed on DataFusion. + [Seattle], [Chicago], [Boston] and [Amsterdam] as well as a Rust NYC meetup in NYC focused on DataFusion. [core DataFusion repo]: https://github.com/apache/arrow-datafusion [changelogs]: https://github.com/apache/datafusion/tree/main/dev/changelog