Spark UDF's contain the following functions: nullable, deterministic, dataType, etc. So according to this information, it would benefit from optimizations such as ConstantFolding. Which other optimizations does it benefit from and which optimizations can it not benefit from? I ask this because many presentations present UDFs as a black box which does not benefit from catalyst optimizations, but clearly, it benefits from ConstantFolding.
Which optimizations do UDFs not benefit from?
838 Views Asked by abden003 At
1
There are 1 best solutions below
Related Questions in APACHE-SPARK
- Getting error while running spark-shell on my system; pyspark is running fine
- ingesting high volume small size files in azure databricks
- Spark load all partions at once
- Databricks Delta table / Compute job
- Autocomplete not working for apache spark in java vscode
- How to overwrite a single partition in Snowflake when using Spark connector
- Parse multiple record type fixedlength file with beanio gives oom and timeout error for 10GB data file
- includeExistingFiles: false does not work in Databricks Autoloader
- Spark connectors from Azure Databricks to Snowflake using AzureAD login
- SparkException: Task failed while writing rows, caused by Futures timed out
- Configuring Apache Spark's MemoryStream to simulate Kafka stream
- Databricks can't find a csv file inside a wheel I installed when running from a Databricks Notebook
- Add unique id to rows in batches in Pyspark dataframe
- Does Spark Dynamic Allocation depend on external shuffle service to work well?
- Does Spark structured streaming support chained flatMapGroupsWithState by different key?
Related Questions in APACHE-SPARK-SQL
- Spark load all partions at once
- Joining 2 pyspark dataframes and continuing a running window sum and max
- Understanding least common type in databricks
- Insert selective columns into pyspark dataframe
- Dataframe won't save as anything - table, global temp view or temp view
- Spark TBLPROPERTIES to sql query?
- How to groupBy on two columns and work out avg total value for each grouped column using pyspark
- Spark SQL repartition before insert operation
- Convert 3 letter month column into a month number in Databricks SQL
- Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 1, column 1 - When reading table in SQL
- How to sort a PySpark dataframe rows by the order of a list?
- How to read csv files in dbfs using Spark SQL only?
- Handle different date formats in Pyspark
- Insert Overwrite partition data using Spark SQL on MINIO table
- update value in specific row by checking condition for another column values in pyspark
Related Questions in CATALYST-OPTIMIZER
- Spark reads all columns in filtering when using scala syntax
- Why would finding an aggregate of a partition column in Spark 3 take very long time?
- How to structure large queries in spark
- Does Spark SQL optimize lower() on both sides?
- How do you inspect candidate logical plans of cost-based SQL optimizer in spark (scala)?
- is it possible to avoid second exchange when spark joins two datasets using joinWith?
- Apache Spark What is the difference between requiredChildDistribution and outputPartitioning?
- Apache Spark dataframe lineage trimming via RDD and role of cache
- What is the role of Catalyst optimizer and Project Tungsten
- Dataframe API vs Spark.sql
- Export a spark logical/physical plan?
- Is it possible to outperform the Catalyst optimizer on highly skewed data using only RDDs
- For "iterative algorithms," what is the advantage of converting to an RDD then back to a Dataframe
- steps in spark physical plan not assigned to DAG step
- Spark internals: benefits of Project
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
Popular # Hahtags
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
Spark handles UDF's by wrapping them inside of a class. For example when you write the following:
What the
udffunction does is create aUserDefinedFunctionclass which in its apply function creates aScalaUDF.ScalaUDF extends Expression, and in its doCodeGen method it does the following:This function converts the
DataTypeof the column/expression to a Scala type (because your UDF operates on scala types), and then it calls your lambda. Thedeterministic,nullable,anddataTypesare functions of the wrapper of the user-defined function because it extends Expression, not your function. If you want to fully benefit from them, you would have to write a custom Expression which extendsExpressionor one of its sub-classes.Take the following as an example:
The optimized logical plan would look something like this:
As you can see it is doing the filter even though it is redundant and will always evaluate to true.
Whereas the following:
would give the following optimized logical plan:
It prunes out the filter using PruneFilter rule.
This doesn't mean all optimizations are excluded, there are optimizations which still work with UDFs such as
CombineFilterwhich combines the expression from two filters for example:This optimization works because it is only dependent on the
deterministicfield and UDFs are deterministic by default. So UDFs will benefit from simple optimizations that aren't dependent on the function it wraps. This is because it is in a format which catalyst doesn't understand, catalyst operates on Trees, and your closure is a Scala function. There are other places where UDFs lose out such as specifying the java code generated and spark type information.