NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #426 most downloaded on PyPI
Snowflake Snowpark for Python
Last release 11 days ago
10 Sep 2026
Ships fairly regularly
a new release about every 2 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
4 versions withdrawn
withdrawn after publishing
4 years old
76 releases · first in 2022
One column per quarter.
Added support for these new functions in snowflake.snowpark.functions:
snowflake.snowpark.functions:
array_sortsort_arrayarray_minarray_maxexplode_outerSession.add_requirements or Session.add_packages. They are now usable in stored procedures and UDFs even if packages are not present on the Snowflake Anaconda channel.
custom_packages_upload_enabled and custom_packages_force_upload_enabled to enable the support for pure Python packages feature mentioned above. Both parameters default to False.Session.add_requirements.DataFrame.rename.params in session.sql() in stored procedures.TIMESTAMP_NTZ, TIMESTAMP_LTZ, TIMESTAMP_TZ)
TimestampTimezone as an argument in TimestampType constructor.NTZ, LTZ, TZ and Timestamp to annotate functions when registering UDFs.typing-extensions.DataFrame.cache_result now creates temp table fully qualified names under current database and current schema.numpy.ufunc.DataFrame.union was not generating the correct Selectable.schema_query when SQL simplifier is enabled.DataFrameWriter.save_as_table now respects the nullable field of the schema provided by the user or the inferred schema based on data from user input.snowflake-connector-python to 3.0.4.Nothing published for this version
Added support for the Python 3.10 runtime environment.
New Features
Aggregation results, from functions such as DataFrame.agg and DataFrame.describe, no longer strip away non-printing characters from column names.
Added support for session.getOrCreate.
session.getOrCreate.Column.getField.snowflake.snowpark.functions:
date_add and date_sub to make add and subtract operations easier.daydiffexplodearray_distinct.regexp_extract.struct.format_number.bround.substring_indexskip_upload_on_content_match when creating UDFs, UDTFs and stored procedures using register_from_file to skip uploading files to a stage if the same version of the files are already on the stage.DataFrame.save_as_table method to take table names that contain dots.DataFrame.filter() or DataFrame.order_by() is followed by a projection statement (e.g. DataFrame.select(), DataFrame.with_column()).Dataframe.create_or_replace_dynamic_table.params in session.sql() to support binding variables. Note that this is not supported in stored procedures yet.strtok_to_array where an exception was thrown when a delimiter was passed in.session.add_import where the module had the same namespace as other dependencies.Added support for delimiters parameter in functions.initcap().
delimiters parameter in functions.initcap().functions.hash() to accept a variable number of input expressions.Session.conf for getting, setting or checking the mutability of any runtime configuration.Row results from DataFrame.collect using case_sensitive parameter.snowflake.snowpark.types.StructType.log_on_exception to Dataframe.collect and Dataframe.collect_no_wait to optionally disable error logging for SQL exceptions.DataFrame.substract, DataFrame.union, etc.) being called after another DataFrame set operation and DataFrame.select or DataFrame.with_column throws an exception.SNOWPARK_LEFT, SNOWPARK_RIGHT) by default. Users can disable this at runtime with session.conf.set('use_constant_subquery_alias', False) to use randomly generated alias names instead.session.call().…Preview) to replace is_owner_file is marked for deprecation.
source_code_display=False at registration.if_not_exists when creating a UDF, UDTF or Stored Procedure from Snowpark Python to ignore creating the specified function or procedure if it already exists.snowflake.snowpark.functions.get to extract value from array.functions.reverse in functions to open access to Snowflake built-in function
reverse.require_scoped_url in snowflake.snowflake.files.SnowflakeFile.open() (in Private Preview) to replace is_owner_file is marked for deprecation.paramstyle to qmark when creating a Snowpark session.df.join(..., how="cross") fails with SnowparkJoinException: (1112): Unsupported using join type 'Cross'.DataFrame column created from chained function calls used a wrong column name.Added asc, asc_nulls_first, asc_nulls_last, desc, desc_nulls_first, desc_nulls_last, date_part and unix_timestamp in functions.
asc, asc_nulls_first, asc_nulls_last, desc, desc_nulls_first, desc_nulls_last, date_part and unix_timestamp in functions.DataFrame.dtypes to return a list of column name and data type pairs.functions.expr() for functions.sql_expr().functions.date_format() for functions.to_date().functions.monotonically_increasing_id() for functions.seq8()functions.from_unixtime() for functions.to_timestamp()PYTHON_SNOWPARK_USE_SQL_SIMPLIFIER is True after Snowflake 7.3 was released. In snowpark-python, session.sql_simplifier_enabled reads the value of PYTHON_SNOWPARK_USE_SQL_SIMPLIFIER by default, meaning that the SQL simplfier is enabled by default after the Snowflake 7.3 release. To turn this off, set PYTHON_SNOWPARK_USE_SQL_SIMPLIFIER in Snowflake to False or run session.sql_simplifier_enabled = False from Snowpark. It is recommended to use the SQL simplifier because it helps to generate more concise SQL.Added Session.generator() to create a new DataFrame using the Generator table function.
Session.generator() to create a new DataFrame using the Generator table function.secure to the functions that create a secure UDF or UDTF.Session.create_async_job() to create an AsyncJob instance from a query id.
Session.create_async_job() to create an AsyncJob instance from a query id.AsyncJob.result() now accepts argument result_type to return the results in different formats.AsyncJob.to_df() returns a DataFrame built from the result of this asynchronous job.AsyncJob.query() returns the SQL text of the executed query.DataFrame.agg() and RelationalGroupedDataFrame.agg() now accept variable-length arguments.lsuffix and rsuffix to DataFram.join() and DataFrame.cross_join() to conveniently rename overlapping columns.Table.drop_table() so you can drop the temp table after DataFrame.cache_result(). Table is also a context manager so you can use the with statement to drop the cache temp table after use.Session.use_secondary_roles().first_value() and last_value(). (contributed by @chasleslr)on as an alias for using_columns and how as an alias for join_type in DataFrame.join().Session.create_dataframe() that raised an error when schema names had special characters.Session.read.option() were not passed to DataFrame.copy_into_table() as default values.DataFrame.copy_into_table() raises an error when a copy option has single quotes in the value.Session.add_packages() now raises ValueError when the version of a package cannot be found in Snowflake Anaconda channel. Previously, Session.add_pack
Session.add_packages() now raises ValueError when the version of a package cannot be found in Snowflake Anaconda channel. Previously, Session.add_packages() succeeded, and a SnowparkSQLException exception was raised later in the UDF/SP registration step.FileOperation.get_stream() to support downloading stage files as stream.functions.ntiles() to accept int argument.functions.call_function() for functions.call_builtin().functions.function() for functions.builtin().DataFrame.order_by() for DataFrame.sort()DataFrame.orderBy() for DataFrame.sort()DataFrame.cache_result() to return a more accurate Table class instead of a DataFrame class.session as the first argument when calling StoredProcedure.Session.sql_simplifier_enabled = True.DataFrame.select(), DataFrame.with_column(), DataFrame.drop() and other select-related APIs have more flattened SQLs.DataFrame.union(), DataFrame.union_all(), DataFrame.except_(), DataFrame.intersect(), DataFrame.union_by_name() have flattened SQLs generated when multiple set operators are chained.Table.update(), Table.delete(), Table.merge() try to reference a temp table that does not exist.Deprecated keyword argument create_temp_table in Session.write_pandas().
block to the following action APIs on Snowpark dataframes (which execute queries) to allow asynchronous evaluations:
DataFrame.collect(), DataFrame.to_local_iterator(), DataFrame.to_pandas(), DataFrame.to_pandas_batches(), DataFrame.count(), DataFrame.first().DataFrameWriter.save_as_table(), DataFrameWriter.copy_into_location().Table.delete(), Table.update(), Table.merge().DataFrame.collect_nowait() to allow asynchronous evaluations.AsyncJob to retrieve results from asynchronously executed queries and check their status.table_type in Session.write_pandas(). You can now choose from these table_type options: "temporary", "temp", and "transient".list, tuple and dict) as literal values in Snowpark.execute_as to functions.sproc() and session.sproc.register() to allow registering a stored procedure as a caller or owner.DataFrame.copy_into_table() and DataFrameWriter.save_as_table() mistakenly created a new table if the table name is fully qualified, and the table already exists.create_temp_table in Session.write_pandas().snowflake-connector-python to 2.7.12.Added support for displaying source code as comments in the generated scripts when registering UDFs. This feature is turned on by default. To turn it
source_code_display as False when calling register() or @udf().DataFrame.select(), DataFrame.with_column() and DataFrame.with_columns() which now take parameters of type table_function.TableFunctionCall for columns.overwrite to session.write_pandas() to allow overwriting contents of a Snowflake table with that of a Pandas DataFrame.column_order to df.write.save_as_table() to specify the matching rules when inserting data into table in append mode.FileOperation.put_stream() to upload local files to a stage via file stream.TableFunctionCall.alias() and TableFunctionCall.as_() to allow aliasing the names of columns that come from the output of table function joins.get_active_session() in module snowflake.snowpark.context to get the current active Snowpark session.statement_params is not passed to the function.session.create_dataframe() is called with dicts and a given schema.df.write.save_as_table().function.uniform() to infer the types of inputs max_ and min_ and cast the limits to IntegerType or FloatType correspondingly.Added keyword only argument statement_params to the following methods to allow for specifying statement level parameters:
statement_params to the following methods to allow for specifying statement level parameters:
collect, to_local_iterator, to_pandas, to_pandas_batches,
count, copy_into_table, show, create_or_replace_view, create_or_replace_temp_view, first, cache_result
and random_split on class snowflake.snowpark.Dateframe.update, delete and merge on class snowflake.snowpark.Table.save_as_table and copy_into_location on class snowflake.snowpark.DataFrameWriter.approx_quantile, statement_params, cov and crosstab on class snowflake.snowpark.DataFrameStatFunctions.register and register_from_file on class snowflake.snowpark.udf.UDFRegistration.register and register_from_file on class snowflake.snowpark.udtf.UDTFRegistration.register and register_from_file on class snowflake.snowpark.stored_procedure.StoredProcedureRegistration.udf, udtf and sproc in snowflake.snowpark.functions.Column as an input argument to session.call().table_type in df.write.save_as_table(). You can now choose from these table_type options: "temporary", "temp", and "transient".session.use_* methods.session.create_dataframe().session.create_dataframe() mistakenly converted 0 and False to None when the input data was only a list.session.create_dataframe() using a large local dataset sometimes created a temp table twice.function.trim() with the SQL function definition.sum vs. the Snowpark function.sum().Added support for user-defined table functions (UDTFs).
snowflake.snowpark.functions.udtf() to register a UDTF, or use it as a decorator to register the UDTF.
Session.udtf.register() to register a UDTF.Session.udtf.register_from_file() to register a UDTF from a Python file.snowflake.snowpark.functions.table_function() to create a callable representing a table function and use it to call the table function in a query.snowflake.snowpark.functions.call_table_function() to call a table function.over clause that specifies partition by and order by when lateral joining a table function.Session.table_function() and DataFrame.join_table_function() to accept TableFunctionCall instances.functions.udf() and functions.sproc(), you can now specify an empty list for the imports or packages argument to indicate that no import or package is used for this UDF or stored procedure. Previously, specifying an empty list meant that the function would use session-level imports or packages.__repr__ implementation of data types in types.py. The unused type_name property has been removed.ProgrammingError from the Python connector.DataFrame.to_pandas().DataFrameReader.parquet() failed to read a parquet file when its column contained spaces.DataFrame.copy_into_table() failed when the dataframe is created by reading a file with inferred schemas.Session.flatten() and DataFrame.flatten().
cloudpickle <= 2.0.0.Removed the following APIs that were deprecated in 0.4.0: DataFrame.groupByGroupingSets(), DataFrame.naturalJoin(), DataFrame.joinTableFunction, DataF…
current_session(), current_statement(), current_user(), current_version(), current_warehouse(), date_from_parts(), date_trunc(), dayname(), dayofmonth(), dayofweek(), dayofyear(), grouping(), grouping_id(), hour(), last_day(), minute(), next_day(), previous_day(), second(), month(), monthname(), quarter(), year(), current_database(), current_role(), current_schema(), current_schemas(), current_region(), current_avaliable_roles(), add_months(), any_value(), bitnot(), bitshiftleft(), bitshiftright(), convert_timezone(), uniform(), strtok_to_array(), sysdate(), time_from_parts(), timestamp_from_parts(), timestamp_ltz_from_parts(), timestamp_ntz_from_parts(), timestamp_tz_from_parts(), weekofyear(), percentile_cont() to snowflake.snowflake.functions.DataFrame.groupByGroupingSets(), DataFrame.naturalJoin(), DataFrame.joinTableFunction, DataFrame.withColumns(), Session.getImports(), Session.addImport(), Session.removeImport(), Session.clearImports(), Session.getSessionStage(), Session.getDefaultDatabase(), Session.getDefaultSchema(), Session.getCurrentDatabase(), Session.getCurrentSchema(), Session.getFullyQualifiedCurrentSchema().DataFrame with a specific schema using the Session.create_dataframe() method.INFO to DEBUG for several logs (e.g., the executed query) when evaluating a dataframe.Session.create_dataframe() method.typing-extension as a new dependency with the version >= 4.1.0.Your coding agent can read these notes before it upgrades. Set up the MCP server →