Snowpark库为在Snowflake中以规模查询和处理数据提供了直观的library。使用这个library中的任意一种语言,你可以构建在Snowflake中处理数据的应用程序,而无需将数据移动到应用程序代码运行的系统,并作为弹性和无服务器Snowflake引擎的一部分进行规模处理。
目前,Snowflake为三种语言提供Snowpark库:Java、Python和Scala。
Snowpark VS Snowflake Spark Connector
与使用Snowflake Connector for Spark相比,使用Snowpark进行开发具有以下优势:
- 支持使用专为不同语言而构建的库和模式与Snowflake内部的数据进行交互,而不会牺牲性能或功能。
- 支持使用本地工具(如Jupyter、VS Code或IntelliJ)编写Snowpark代码。
- 支持对所有操作(包括Snowflake UDFs)进行下推。这意味着Snowpark将所有数据转换和繁重的工作下推到Snowflake cloud,使您能够高效处理任何大小的数据。
- 无需在Snowflake之外使用单独的集群进行计算。所有计算都在Snowflake内部完成。规模和计算管理由Snowflake处理。
减少数据传输
Snowpark操作在服务器上以惰性方式执行,这意味着您可以使用该库延迟运行数据转换,尽可能晚地在流水线中运行,同时将许多操作批量合并为单个操作。这减少了客户端与Snowflake数据库之间传输的数据量,同时提高了性能。
Snowpark中的核心抽象是DataFrame,它表示一组数据并提供操作这些数据的方法。在客户端代码中,您构建一个DataFrame对象,并设置它来检索您想要使用的数据(例如,包含数据的列,要应用的行过滤器等)。
在构建DataFrame对象时,并不会立即检索数据。相反,当您准备好检索数据时,可以执行一个操作来评估DataFrame对象并将相应的SQL语句发送到Snowflake数据库进行执行。
>>> # Create a DataFrame with the "id" and "name" columns from the "sample_product_data" table.
>>> # This does not execute the query.
>>> df = session.table("sample_product_data").select(col("id"), col("name"))
>>> # Send the query to the server for execution and
>>> # return a list of Rows containing the results.
>>> results = df.collect()
创建内联UDF的能力
您可以在Snowpark应用程序中内联创建用户定义函数(UDF)。Snowpark可以将您的代码推送到服务器上,在服务器上对数据进行大规模操作。这在循环或批处理功能中非常有用,通过创建为UDF,Snowflake可以在其内部以大规模并行化和应用代码逻辑。
您可以使用与编写客户端代码相同的语言编写函数(例如,在Scala中使用匿名函数,在Python中使用lambda函数)。要在Snowflake数据库中使用这些函数来处理数据,您可以在自定义代码中定义和调用用户定义的函数(UDFs)。
Snowpark会自动将自定义UDF的代码推送到Snowflake数据库。当您在客户端代码中调用UDF时,您的自定义代码将在服务器上(即数据所在的地方)执行。您不需要将数据传输到客户端以执行函数。