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時,您的自定義代碼將在服務器上(即數據所在的地方)執行。您不需要將數據傳輸到客戶端以執行函數。