pyspark broadcast join hint

By signing up, you agree to our Terms of Use and Privacy Policy. The REBALANCE can only 1. Not the answer you're looking for? You can use theCOALESCEhint to reduce the number of partitions to the specified number of partitions. It reduces the data shuffling by broadcasting the smaller data frame in the nodes of PySpark cluster. Is email scraping still a thing for spammers. A Medium publication sharing concepts, ideas and codes. Traditional joins are hard with Spark because the data is split. In this benchmark we will simply join two DataFrames with the following data size and cluster configuration: To run the query for each of the algorithms we use the noop datasource, which is a new feature in Spark 3.0, that allows running the job without doing the actual write, so the execution time accounts for reading the data (which is in parquet format) and execution of the join. Before Spark 3.0 the only allowed hint was broadcast, which is equivalent to using the broadcast function: In this note, we will explain the major difference between these three algorithms to understand better for which situation they are suitable and we will share some related performance tips. You may also have a look at the following articles to learn more . There are various ways how Spark will estimate the size of both sides of the join, depending on how we read the data, whether statistics are computed in the metastore and whether the cost-based optimization feature is turned on or off. PySpark Broadcast Join is a type of join operation in PySpark that is used to join data frames by broadcasting it in PySpark application. Why was the nose gear of Concorde located so far aft? ALL RIGHTS RESERVED. and REPARTITION_BY_RANGE hints are supported and are equivalent to coalesce, repartition, and The threshold for automatic broadcast join detection can be tuned or disabled. Broadcast joins are easier to run on a cluster. We will cover the logic behind the size estimation and the cost-based optimizer in some future post. Here we are creating the larger DataFrame from the dataset available in Databricks and a smaller one manually. This is an optimal and cost-efficient join model that can be used in the PySpark application. After the small DataFrame is broadcasted, Spark can perform a join without shuffling any of the data in the . How to Optimize Query Performance on Redshift? (autoBroadcast just wont pick it). How to react to a students panic attack in an oral exam? Except it takes a bloody ice age to run. We can also do the join operation over the other columns also which can be further used for the creation of a new data frame. If you want to configure it to another number, we can set it in the SparkSession: The reason why is SMJ preferred by default is that it is more robust with respect to OoM errors. This hint is ignored if AQE is not enabled. Let us create the other data frame with data2. Broadcast the smaller DataFrame. If a law is new but its interpretation is vague, can the courts directly ask the drafters the intent and official interpretation of their law? This has the advantage that the other side of the join doesnt require any shuffle and it will be beneficial especially if this other side is very large, so not doing the shuffle will bring notable speed-up as compared to other algorithms that would have to do the shuffle. How do I get the row count of a Pandas DataFrame? 6. -- is overridden by another hint and will not take effect. This can be set up by using autoBroadcastJoinThreshold configuration in SQL conf. The limitation of broadcast join is that we have to make sure the size of the smaller DataFrame gets fits into the executor memory. This technique is ideal for joining a large DataFrame with a smaller one. Articles on Scala, Akka, Apache Spark and more, #263 as bigint) ASC NULLS FIRST], false, 0, #294L], [cast(id#298 as bigint)], Inner, BuildRight, // size estimated by Spark - auto-broadcast, Streaming SQL with Apache Flink: A Gentle Introduction, Optimizing Kafka Clients: A Hands-On Guide, Scala CLI Tutorial: Creating a CLI Sudoku Solver, tagging each row with one of n possible tags, where n is small enough for most 3-year-olds to count to, finding the occurrences of some preferred values (so some sort of filter), doing a variety of lookups with the small dataset acting as a lookup table, a sort of the big DataFrame, which comes after, and a sort + shuffle + small filter on the small DataFrame. Imagine a situation like this, In this query we join two DataFrames, where the second dfB is a result of some expensive transformations, there is called a user-defined function (UDF) and then the data is aggregated. Refer to this Jira and this for more details regarding this functionality. Its value purely depends on the executors memory. with respect to join methods due to conservativeness or the lack of proper statistics. The larger the DataFrame, the more time required to transfer to the worker nodes. I want to use BROADCAST hint on multiple small tables while joining with a large table. You can use theREPARTITIONhint to repartition to the specified number of partitions using the specified partitioning expressions. If it's not '=' join: Look at the join hints, in the following order: 1. broadcast hint: pick broadcast nested loop join. You can use the hint in an SQL statement indeed, but not sure how far this works. Here you can see a physical plan for BHJ, it has to branches, where one of them (here it is the branch on the right) represents the broadcasted data: Spark will choose this algorithm if one side of the join is smaller than the autoBroadcastJoinThreshold, which is 10MB as default. Theoretically Correct vs Practical Notation. From various examples and classifications, we tried to understand how this LIKE function works in PySpark broadcast join and what are is use at the programming level. In addition, when using a join hint the Adaptive Query Execution (since Spark 3.x) will also not change the strategy given in the hint. How to increase the number of CPUs in my computer? if(typeof ez_ad_units != 'undefined'){ez_ad_units.push([[728,90],'sparkbyexamples_com-box-2','ezslot_8',132,'0','0'])};__ez_fad_position('div-gpt-ad-sparkbyexamples_com-box-2-0');Broadcast join is an optimization technique in the PySpark SQL engine that is used to join two DataFrames. Copyright 2023 MungingData. Create a Pandas Dataframe by appending one row at a time, Selecting multiple columns in a Pandas dataframe. The threshold value for broadcast DataFrame is passed in bytes and can also be disabled by setting up its value as -1.if(typeof ez_ad_units != 'undefined'){ez_ad_units.push([[728,90],'sparkbyexamples_com-box-4','ezslot_6',153,'0','0'])};__ez_fad_position('div-gpt-ad-sparkbyexamples_com-box-4-0'); For our demo purpose, let us create two DataFrames of one large and one small using Databricks. It takes column names and an optional partition number as parameters. To subscribe to this RSS feed, copy and paste this URL into your RSS reader. 4. Which basecaller for nanopore is the best to produce event tables with information about the block size/move table? Lets create a DataFrame with information about people and another DataFrame with information about cities. In the example below SMALLTABLE2 is joined multiple times with the LARGETABLE on different joining columns. SMJ requires both sides of the join to have correct partitioning and order and in the general case this will be ensured by shuffle and sort in both branches of the join, so the typical physical plan looks like this. Pyspark dataframe joins with few duplicated column names and few without duplicate columns, Applications of super-mathematics to non-super mathematics. spark, Interoperability between Akka Streams and actors with code examples. Remember that table joins in Spark are split between the cluster workers. Spark SQL supports many hints types such as COALESCE and REPARTITION, JOIN type hints including BROADCAST hints. Normally, Spark will redistribute the records on both DataFrames by hashing the joined column, so that the same hash implies matching keys, which implies matching rows. Pick broadcast nested loop join if one side is small enough to broadcast. Not the answer you're looking for? repartitionByRange Dataset APIs, respectively. The reason behind that is an internal configuration setting spark.sql.join.preferSortMergeJoin which is set to True as default. It takes a partition number, column names, or both as parameters. Launching the CI/CD and R Collectives and community editing features for What is the maximum size for a broadcast object in Spark? The REPARTITION hint can be used to repartition to the specified number of partitions using the specified partitioning expressions. As described by my fav book (HPS) pls. This is a current limitation of spark, see SPARK-6235. Spark Broadcast joins cannot be used when joining two large DataFrames. Hints provide a mechanism to direct the optimizer to choose a certain query execution plan based on the specific criteria. dfA.join(dfB.hint(algorithm), join_condition), spark.conf.set("spark.sql.autoBroadcastJoinThreshold", 100 * 1024 * 1024), spark.conf.set("spark.sql.broadcastTimeout", time_in_sec), Platform: Databricks (runtime 7.0 with Spark 3.0.0), the joining condition (whether or not it is equi-join), the join type (inner, left, full outer, ), the estimated size of the data at the moment of the join. The syntax for that is very simple, however, it may not be so clear what is happening under the hood and whether the execution is as efficient as it could be. Following are the Spark SQL partitioning hints. How to Export SQL Server Table to S3 using Spark? Show the query plan and consider differences from the original. Both BNLJ and CPJ are rather slow algorithms and are encouraged to be avoided by providing an equi-condition if it is possible. It takes a partition number, column names, or both as parameters. If you look at the query execution plan, a broadcastHashJoin indicates you've successfully configured broadcasting. The shuffle and sort are very expensive operations and in principle, they can be avoided by creating the DataFrames from correctly bucketed tables, which would make the join execution more efficient. This join can be used for the data frame that is smaller in size which can be broadcasted with the PySpark application to be used further. It takes a partition number as a parameter. What would happen if an airplane climbed beyond its preset cruise altitude that the pilot set in the pressurization system? This is also related to the cost-based optimizer how it handles the statistics and whether it is even turned on in the first place (by default it is still off in Spark 3.0 and we will describe the logic related to it in some future post). RV coach and starter batteries connect negative to chassis; how does energy from either batteries' + terminal know which battery to flow back to? Broadcast joins are easier to run on a cluster. PySpark BROADCAST JOIN can be used for joining the PySpark data frame one with smaller data and the other with the bigger one. It is a cost-efficient model that can be used. By clicking Post Your Answer, you agree to our terms of service, privacy policy and cookie policy. The DataFrames flights_df and airports_df are available to you. This choice may not be the best in all cases and having a proper understanding of the internal behavior may allow us to lead Spark towards better performance. Hence, the traditional join is a very expensive operation in Spark. 542), How Intuit democratizes AI development across teams through reusability, We've added a "Necessary cookies only" option to the cookie consent popup. In many cases, Spark can automatically detect whether to use a broadcast join or not, depending on the size of the data. MERGE, SHUFFLE_HASH and SHUFFLE_REPLICATE_NL Joint Hints support was added in 3.0. Scala CLI is a great tool for prototyping and building Scala applications. But as you may already know, a shuffle is a massively expensive operation. Make sure to read up on broadcasting maps, another design pattern thats great for solving problems in distributed systems. The Spark SQL BROADCAST join hint suggests that Spark use broadcast join. Help me understand the context behind the "It's okay to be white" question in a recent Rasmussen Poll, and what if anything might these results show? New in version 1.3.0. a string for the join column name, a list of column names, a join expression (Column), or a list of Columns. The join side with the hint will be broadcast. Tags: This is a guide to PySpark Broadcast Join. If both sides have the shuffle hash hints, Spark chooses the smaller side (based on stats) as the build side. You can specify query hints usingDataset.hintoperator orSELECT SQL statements with hints. Lets broadcast the citiesDF and join it with the peopleDF. join ( df3, df1. After the small DataFrame is broadcasted, Spark can perform a join without shuffling any of the data in the large DataFrame. Using broadcasting on Spark joins. By clicking Post Your Answer, you agree to our terms of service, privacy policy and cookie policy. Dealing with hard questions during a software developer interview. THE CERTIFICATION NAMES ARE THE TRADEMARKS OF THEIR RESPECTIVE OWNERS. Spark SQL partitioning hints allow users to suggest a partitioning strategy that Spark should follow. Why are non-Western countries siding with China in the UN? How does a fan in a turbofan engine suck air in? Broadcast join is an important part of Spark SQL's execution engine. I am trying to effectively join two DataFrames, one of which is large and the second is a bit smaller. Lets use the explain() method to analyze the physical plan of the broadcast join. Why does the above join take so long to run? Lets have a look at this jobs query plan so that we can see the operations Spark will perform as its computing our innocent join: This will give you a piece of text that looks very cryptic, but its information-dense: In this query plan, we read the operations in dependency order from top to bottom, or in computation order from bottom to top. Broadcasting further avoids the shuffling of data and the data network operation is comparatively lesser. Check out Writing Beautiful Spark Code for full coverage of broadcast joins. The timeout is related to another configuration that defines a time limit by which the data must be broadcasted and if it takes longer, it will fail with an error. When you need to join more than two tables, you either use SQL expression after creating a temporary view on the DataFrame or use the result of join operation to join with another DataFrame like chaining them. All in One Software Development Bundle (600+ Courses, 50+ projects) Price The broadcast method is imported from the PySpark SQL function can be used for broadcasting the data frame to it. To understand the logic behind this Exchange and Sort, see my previous article where I explain why and how are these operators added to the plan. In SparkSQL you can see the type of join being performed by calling queryExecution.executedPlan. The broadcast join operation is achieved by the smaller data frame with the bigger data frame model where the smaller data frame is broadcasted and the join operation is performed. I write about Big Data, Data Warehouse technologies, Databases, and other general software related stuffs. Remember that table joins in Spark are split between the cluster workers. By using DataFrames without creating any temp tables. This repartition hint is equivalent to repartition Dataset APIs. id3,"inner") 6. The PySpark Broadcast is created using the broadcast (v) method of the SparkContext class. Basic Spark Transformations and Actions using pyspark, Spark SQL Performance Tuning Improve Spark SQL Performance, Spark RDD Cache and Persist to Improve Performance, Spark SQL Recursive DataFrame Pyspark and Scala, Apache Spark SQL Supported Subqueries and Examples. from pyspark.sql import SQLContext sqlContext = SQLContext . Query hints give users a way to suggest how Spark SQL to use specific approaches to generate its execution plan. Redshift RSQL Control Statements IF-ELSE-GOTO-LABEL. Suppose that we know that the output of the aggregation is very small because the cardinality of the id column is low. You can hint to Spark SQL that a given DF should be broadcast for join by calling method broadcast on the DataFrame before joining it, Example: Are you sure there is no other good way to do this, e.g. Suggests that Spark use broadcast join. By clicking Accept, you are agreeing to our cookie policy. No more shuffles on the big DataFrame, but a BroadcastExchange on the small one. Its best to avoid the shortcut join syntax so your physical plans stay as simple as possible. Partitioning hints allow users to suggest a partitioning strategy that Spark should follow. Broadcast join naturally handles data skewness as there is very minimal shuffling. Instead, we're going to use Spark's broadcast operations to give each node a copy of the specified data. How to increase the number of CPUs in my computer? Other Configuration Options in Spark SQL, DataFrames and Datasets Guide. Lets start by creating simple data in PySpark. If both sides of the join have the broadcast hints, the one with the smaller size (based on stats) will be broadcast. Does With(NoLock) help with query performance? The aliases forMERGEjoin hint areSHUFFLE_MERGEandMERGEJOIN. The default size of the threshold is rather conservative and can be increased by changing the internal configuration. This is a shuffle. In order to do broadcast join, we should use the broadcast shared variable. This post explains how to do a simple broadcast join and how the broadcast() function helps Spark optimize the execution plan. e.g. Also, the syntax and examples helped us to understand much precisely the function. As with core Spark, if one of the tables is much smaller than the other you may want a broadcast hash join. Well use scala-cli, Scala Native and decline to build a brute-force sudoku solver. By clicking Accept all cookies, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy. Can non-Muslims ride the Haramain high-speed train in Saudi Arabia? Hint Framework was added inSpark SQL 2.2. Examples >>> Making statements based on opinion; back them up with references or personal experience. You can also increase the size of the broadcast join threshold using some properties which I will be discussing later. MERGE Suggests that Spark use shuffle sort merge join. Centering layers in OpenLayers v4 after layer loading. If both sides of the join have the broadcast hints, the one with the smaller size (based on stats) will be broadcast. id2,"inner") \ . For example, to increase it to 100MB, you can just call, The optimal value will depend on the resources on your cluster. Does Cosmic Background radiation transmit heat? since smallDF should be saved in memory instead of largeDF, but in normal case Table1 LEFT OUTER JOIN Table2, Table2 RIGHT OUTER JOIN Table1 are equal, What is the right import for this broadcast? Another joining algorithm provided by Spark is ShuffledHashJoin (SHJ in the next text). Deduplicating and Collapsing Records in Spark DataFrames, Compacting Files with Spark to Address the Small File Problem, The Virtuous Content Cycle for Developer Advocates, Convert streaming CSV data to Delta Lake with different latency requirements, Install PySpark, Delta Lake, and Jupyter Notebooks on Mac with conda, Ultra-cheap international real estate markets in 2022, Chaining Custom PySpark DataFrame Transformations, Serializing and Deserializing Scala Case Classes with JSON, Exploring DataFrames with summary and describe, Calculating Week Start and Week End Dates with Spark. Here we discuss the Introduction, syntax, Working of the PySpark Broadcast Join example with code implementation. Broadcast joins cannot be used when joining two large DataFrames. There are two types of broadcast joins.if(typeof ez_ad_units != 'undefined'){ez_ad_units.push([[300,250],'sparkbyexamples_com-medrectangle-4','ezslot_4',109,'0','0'])};__ez_fad_position('div-gpt-ad-sparkbyexamples_com-medrectangle-4-0'); We can provide the max size of DataFrame as a threshold for automatic broadcast join detection in Spark. Let us try to understand the physical plan out of it. Your email address will not be published. Are there conventions to indicate a new item in a list? If you are using spark 2.2+ then you can use any of these MAPJOIN/BROADCAST/BROADCASTJOIN hints. Join hints in Spark SQL directly. Save my name, email, and website in this browser for the next time I comment. Heres the scenario. The aliases for MERGE are SHUFFLE_MERGE and MERGEJOIN. I found this code works for Broadcast Join in Spark 2.11 version 2.0.0. document.getElementById( "ak_js_1" ).setAttribute( "value", ( new Date() ).getTime() ); SparkByExamples.com is a Big Data and Spark examples community page, all examples are simple and easy to understand, and well tested in our development environment, | { One stop for all Spark Examples }, PySpark Tutorial For Beginners | Python Examples. Syntax so your physical plans stay as simple as possible post explains how to increase the of... Described by my fav book ( HPS ) pls hint and will not take effect side! Another DataFrame with information about cities and decline to build a brute-force sudoku solver lets create a Pandas DataFrame appending! Help with query performance want pyspark broadcast join hint broadcast join is an important part Spark! Column is low easier to run to a students panic attack in SQL. And join it with the hint will be broadcast use any of the threshold rather... Multiple small tables while joining with a smaller one manually Selecting multiple columns a! Node a copy of the broadcast ( v ) method of the data is split execution plan the example SMALLTABLE2. Small one event tables with information about people and another DataFrame with information about people and DataFrame! When joining two large DataFrames and few without duplicate columns, Applications of super-mathematics to mathematics., email, and other general software related stuffs both as parameters the PySpark broadcast join example with code.... In SQL conf hints allow users to suggest how Spark SQL to Spark. Can specify query hints usingDataset.hintoperator orSELECT SQL statements with hints small enough to broadcast your plans... Sql to use Spark 's broadcast operations to give each node a copy of the broadcast ( ). Tags: this is an internal configuration shuffling by broadcasting the smaller side ( based on ;! Sql to use specific approaches to generate its execution plan the optimizer choose!, the traditional join is an optimal and cost-efficient join model that can set... Some future post a BroadcastExchange on the Big DataFrame, but not sure how far this works SQL many. Of a Pandas DataFrame helps Spark optimize the execution plan another DataFrame with information about cities set the!, the traditional join is that we know that the pilot set in the next )! At the following articles to learn more based on stats ) as the build side this. Supports many hints types such as COALESCE and repartition, join type hints including broadcast hints them... Scala-Cli, Scala Native and decline to build a brute-force sudoku solver, one of the is. I want to use Spark 's broadcast operations to give each node a copy the... And this for more details regarding this functionality how the broadcast join naturally handles data skewness as there is small! Multiple small tables while joining with a large DataFrame after the small DataFrame is broadcasted, Spark can automatically whether. The default size of the data the nodes of PySpark cluster my fav (! By signing up, you agree to our terms of service, privacy.... Joining a large DataFrame proper statistics or the lack of proper statistics was added in.... Behind that is an optimal and cost-efficient join model that can be used when two. Internal configuration decline to build a brute-force sudoku solver this URL into your RSS reader you agree to terms... Us try to understand much precisely the function, one of which is set to True as default TRADEMARKS THEIR! Back them up with references or personal experience a copy of the aggregation is small. Non-Super mathematics a Pandas DataFrame larger DataFrame from the original are rather slow algorithms and are to... Network operation is comparatively lesser a students panic attack in an oral?! Spark use broadcast hint on multiple small tables while joining with a smaller one can non-Muslims ride Haramain. If both sides have the shuffle hash hints, Spark can perform join. Should follow this post explains how to do broadcast join going to use specific approaches to its. Other data frame in the large DataFrame with information about people and DataFrame. Limitation of broadcast joins can not be used when joining two large DataFrames cruise altitude the. Dataframes flights_df and airports_df are available to you frame one with smaller data and the cost-based in... Know that the output of the smaller data frame one with smaller data and the data network is! And an optional partition number as parameters not be used in the nodes of PySpark.! The limitation of broadcast joins are easier to run on a cluster PySpark data frame in.. Use theCOALESCEhint to reduce the number of partitions to the specified number of to... To analyze the physical plan of the data shuffling by broadcasting it in PySpark that is an internal...., see SPARK-6235 orSELECT SQL statements with hints is used to join methods to. Methods due to conservativeness or the lack of proper statistics operation in Spark copy the! The executor memory the logic behind the size of the broadcast join we. Learn more is low the smaller side ( based on the specific criteria hint! That we know that the pilot set in the pressurization system the above join take so long to on! An airplane climbed beyond its preset cruise altitude that the output of the aggregation very! Dataframes and Datasets guide consider differences from the dataset available in Databricks and a smaller one.. Specify query hints usingDataset.hintoperator orSELECT SQL statements with hints larger DataFrame from the original (... The shortcut join syntax so your physical plans stay as simple as possible, Warehouse... Will be broadcast hints support was added in 3.0 can be used in the join operation in PySpark is... One row at a time, Selecting multiple columns in a turbofan engine suck air in some properties which will! Akka Streams and actors with code examples choose a certain query execution plan effectively join DataFrames! Model that can be used when joining two large DataFrames is a expensive! May want a broadcast join naturally handles data skewness as there is very small because the data in the below... & gt ; & gt ; & gt ; & gt ; & gt ; Making based... That we have to make sure the size of the PySpark data frame in the of. During a software developer interview write about Big data, data Warehouse,... If an airplane climbed beyond its preset cruise altitude that the pilot set the... Dataframe, the traditional join is that we know that the pilot set in the PySpark broadcast or... Broadcast hint on multiple small tables while joining with a large table join example with code examples the,. Can be set up by using autoBroadcastJoinThreshold configuration in SQL conf being performed by calling.. Agreeing to our terms of service, privacy policy and cookie policy we 're to! Explain ( ) method of the data network operation is comparatively lesser the tables is much smaller the... Suggests that Spark use broadcast hint on multiple small tables while joining with a table. Regarding this functionality the shuffle hash hints, Spark can automatically detect whether to use join! Without duplicate columns, Applications of super-mathematics to non-super mathematics to be avoided by providing an equi-condition if it a! Behind the size of the broadcast ( v ) method of the shared. Hints, Spark chooses the smaller data and the other data frame one with smaller and! An optimal and cost-efficient join model that can be increased by changing the configuration... Provide a mechanism to direct the optimizer to choose a certain query execution plan a. The CERTIFICATION names are the TRADEMARKS of THEIR RESPECTIVE OWNERS join naturally handles data skewness as there is minimal... Specific approaches to generate its execution plan specific approaches to generate its execution plan method... Out of it THEIR RESPECTIVE OWNERS this post explains how to increase number! The block size/move table learn more use specific approaches to generate its execution.! Code examples estimation and the cost-based optimizer in some future post take effect respect... Check out Writing Beautiful Spark code for full coverage of broadcast join to a students panic in... Changing the internal configuration best to avoid the shortcut join syntax so your physical plans as... To analyze the physical plan of the data in the example below is... This repartition hint is ignored if AQE is not enabled how does a fan in list...: this is a cost-efficient model that can be used in PySpark is... And paste this URL into your RSS reader get the row count a. Creating the larger DataFrame from the original you can see the type of join in. Cost-Efficient model that can be used to repartition to the worker nodes thats great for solving problems in systems. One side is small enough to broadcast configuration setting spark.sql.join.preferSortMergeJoin which is large and the other you may know... Added in 3.0 names and an optional partition number, column names pyspark broadcast join hint or both parameters. Use shuffle sort merge join we have to make sure to read up on broadcasting maps another! To understand much precisely the function design pattern thats great for solving problems in systems. Plan out of it Datasets guide a bloody ice age to run to the worker nodes coverage broadcast. Quot ; ) & # x27 ; s execution engine ignored if AQE is not enabled joining!, SHUFFLE_HASH and SHUFFLE_REPLICATE_NL Joint hints support was added in 3.0 broadcast nested loop join if one of aggregation! On opinion ; back them up with references or personal experience data frames by broadcasting the smaller gets!, email, and website in this browser for the next text ) a students attack... Future post increase the number of partitions using the specified number of partitions depending on the size estimation the! Provide a mechanism to direct the optimizer to choose a certain query execution plan code implementation with Spark the!