DZone>大数据专区>用Snowpark DataFrames进行雪花数据处理
使用Snowpark DataFrames的Snowflake数据处理
Snowpark是Snowflake中的一个新的开发者库,它提供了一个API来使用Scala(以及后来的Java或Python)等编程语言来处理数据,而不是SQL。
-
1月4日,22日 - 大数据区 -教程
喜欢 (4)
评论
保存
鸣叫
2.79K浏览次数
加入DZone社区,获得完整的会员体验。
简介
Snowpark是Snowflake的一个新的开发者库,它提供了一个API来使用Scala(以及后来的Java或Python)等编程语言处理数据,而不是SQL。Snowpark的核心概念是DataFrame,它代表了一组数据,例如数据库表中的一些行,可以使用面向对象或函数式编程技术用我们喜欢的工具来处理。 Snowpark DataFrames的概念类似于Apache Spark或Python Panda DataFrames。
开发人员也可以创建用户定义的函数(UDFs),这些函数被推送到 Snowflake 服务器,在那里他们可以对数据进行操作。代码的执行是使用懒人评估;这将减少Snowflake仓库和客户端之间的数据交换量。
当前版本的Snowpark运行在Scala 2.12和JDK 8、9、10或11。它现在处于公开预览阶段,可用于所有账户。
架构
从架构上看,Snowflake 客户端类似于Apache Spark 驱动程序。它执行客户端代码,然后将生成的 SQL 查询推送到 Snowflake 仓库,一旦 Snowflake 计算服务器处理了数据,它就会收到以 DataFrame 格式返回的结果。
图 1:Snowpark 架构
广义上讲,Snowflake 操作可分为两类:转换和行动。转换是懒惰地执行的,所以它们不会导致 DataFrame 被评估。事务的例子是选择、过滤、排序、groupBy 等。 行动则相反;它们将触发对DataFrame的评估,因此Snowpark将DataFrame的SQL查询发送到服务器上进行评估,结果将被下载到客户端的内存中。动作的例子包括显示、收集、取等。
行动中的Snowpark
在我们可以执行任何Snowpark转换和行动之前,我们需要连接到Snowflake仓库并建立一个会话。
Scala
object Main {
def main(args: Array[String]): Unit = {
// Replace the <placeholders> below.
val configs = Map (
"URL" -> "https://<SNOWFLAKE-INSTANCE>.snowflakecomputing.com:443",
"USER" -> "<USERNAME>",
"PASSWORD" -> "<PASSWORD>",
"ROLE" -> "SYSADMIN",
"WAREHOUSE" -> "SALESFORCE_ACCOUNT",
"DB" -> "SALESFORCE_DB",
"SCHEMA" -> "SALESFORCE"
)
val session = Session.builder.configs(configs).create
session.sql("show tables").show()
}
}
从Snowflake管理界面的角度来看,我们有一个SALESFORCE_DB数据库,其模式为SALESFORCE,有3个表。SALESFORCE_ACCOUNT 表代表我们的 Salesforce 实例中的账户,SALESFORCE_ORDER 表存储由这些账户发起的订单,SALESFORCE_ACCOUNT_ORDER 是一个连接表,它将存储连接的查询结果(我们将在本篇文章的后面提到这个)。
图 2: Snowflake 数据库表
要从Salesforce_Account表中检索前10行,我们可以简单地执行以下DataFrame方法。
Scala
// Create a DataFrame from the data in the "salesforce_account" table.
val dfAccount = session.table("salesforce_account")
// To print out the first 10 rows, call:
dfAccount.show()
Snowpark 会将代码转换为 SQL,并将其推送到 Snowflake 仓库进行执行。
Scala
[main] INFO com.snowflake.snowpark.internal.ServerConnection - Execute query [queryID: XXXX] SELECT * FROM ( SELECT * FROM (salesforce_account)) LIMIT 10
我们的VSCode IDE中的输出看起来像这样。
图3:Salesforce_Account表的VSCode输出
我们还可以过滤某些行并执行DataFrame的转换(如选择列)。
Scala
val dfFilter = session.table("salesforce_account").filter(col("type") === "Customer - Direct")
dfFilter.show()
val dfSelect = session.table("salesforce_account").select(col("accountname"), col("phone"))
dfSelect.show()
Snowpark 将生成相应的 SQL 查询并将其推送到 Snowflake 计算服务器。
[main] INFO com.snowflake.snowpark.internal.ServerConnection - Execute query [queryID: XXXX] SELECT * FROM ( SELECT * FROM ( SELECT * FROM (salesforce_account)) WHERE ("TYPE" = 'Customer - Direct')) LIMIT 10
[main] INFO com.snowflake.snowpark.internal.ServerConnection - Execute query [queryID: XXXX] SELECT * FROM ( SELECT "ACCOUNTNAME", "PHONE" FROM ( SELECT * FROM (salesforce_account))) LIMIT 10
以及 VSCode 输出。
图4:过滤和选择方法的VSCode输出
Snowflake DataFrame API 还允许连接数据框架。 在我们的例子中,我们有Snowflake中的Salesforce_Order表,包含这些Salesforce账户执行的订单。我们可以将这些数据拉入我们的 DataFrame,并将它们与账户记录连接起来。
Scala
val dfOrder = session.table("salesforce_order")
dfOrder.show()
val dfJoin = dfAccount.join(dfOrder, col("sfdcid") === col("accountid")).select(col("accountname"), col("phone"),col("productname"), col("amount"))
dfJoin.show()
Snowflake 将 DataFrame 方法转换为 SQL 并将它们推送到 Snowflake 仓库。在 VSCode 中,输出将看起来像这样。
图 5:连接方法的 VSCode 输出
如果我们想持久化我们的计算结果,我们可以通过使用saveAsTable方法来实现。
Scala
dfJoin.write.mode(SaveMode.Overwrite).saveAsTable("salesforce_account_order")
生成的SQL查询看起来像这样。
Scala
[main] INFO com.snowflake.snowpark.internal.ServerConnection - Execute query [queryID: XXXX] CREATE OR REPLACE TABLE salesforce_account_order AS SELECT * FROM ( SELECT "ACCOUNTNAME", "PHONE", "PRODUCTNAME", "AMOUNT" FROM ( SELECT * FROM (( SELECT "ACCOUNTNAME" AS "ACCOUNTNAME", "PHONE" AS "PHONE", "TYPE" AS "TYPE", "SFDCID" AS "SFDCID" FROM ( SELECT * FROM (salesforce_account))) AS SNOWPARK_TEMP_TABLE_UKKLR6UCHN6POXL INNER JOIN ( SELECT "ACCOUNTID" AS "ACCOUNTID", "PRODUCTNAME" AS "PRODUCTNAME", "AMOUNT" AS "AMOUNT" FROM ( SELECT * FROM (salesforce_order))) AS SNOWPARK_TEMP_TABLE_36DEOZXTQJUYKLD ON ("SFDCID" = "ACCOUNTID"))))
而作为一个结果,Snowpark将创建一个新的表或替换现有的表并存储生成的数据。
图 6: Snowflake Salesforce_Account_Order表
结论
Snowpark在数据处理方面开辟了各种各样的操作和工具。它允许创建非常复杂和先进的数据管道。这是一个强大的功能,可以将自定义代码下推到Snowflake仓库,并通过减少不必要的数据传输来执行它,接近数据。
主题。
数据分析、 数据仓库架构、 Snowflake
DZone贡献者所表达的观点属于他们自己。
DZone上的热门话题
评论