使用基于Snowflake的Snowpark DataFrames进行数据处理

简介

Snowpark是Snowflake一个新的开发库,它提供了一个API让用户可以使用编程语言像Scala(后续也会有Java和Python)来代替SQL进行数据处理。

Snowpark的核心概念是DataFrame(数据框),它表示一组数据,就比如说一些数据库表的行,我们可以用最喜欢的工具通过面向对象或者函数式编程的方式处理。Snowpark DataFrames的概念类似于Apache Spark或者Python中Pandas包的DataFrames的含义,是一种表格型的数据结构。

开发者也可以创建自定义函数推送到Snowflake服务器,来更方便地处理数据。Snowpark的代码执行采用了惰性计算的方式,这减少了从Snowpark仓库到客户端之间的数据流转。

当前版本的Snowpark可以运行在Scala 2.12和JDK 8、9、10或11上。它现在处于公开预览阶段,可用于所有账户。

架构特点

从架构的角度来看,Snowpark客户端类似于Apache Spark Driver程序。它执行用户在客户端编写的代码并转为SQL语句推送给Snowpark数据仓库,等Snowpark计算服务端处理完数据后,接收以DataFrame格式组成的返回结果。

广义的说,Snowpark数据仓库的操作可以分为两类:转换和执行。由于转换是延迟执行的,因此它们不会触发DataFrames数据的计算处理过程。像select(查询),filter(过滤),sort(排序),groupBy(分组)等等都属于转换范畴的操作。而执行是正好相反的,它们会触发对DataFrames数据的计算。Snowpark将针对DataFrame数据的SQL语句发送到服务端进行计算,然后将结果返回给客户端内存。show,collect,take等都属于执行操作。

Snowpark执行

在我们可以执行任何Snowpark转换和执行之前,我们需要先连接到Snowpark数据仓库并建立会话。

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()
}
}


从Snowpark管理页面上看,我们有一个SALESFORCE_DB数据库和一个有3个表的SALESFORCE:SALESFORCE_ACCOUNT表表示来自Salesforce实例的账户,SALESFORCE_ORDER表存储由这些账户发起的订单,SALESFORCE_ACCOUNT_ORDER是一个关联表,存储关联的查询结果(我们在这篇文章的后面会再论述这点)。

要检索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中的输出看起来像这样:

我们也可以过滤某些行并执行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中的输出:

Snowpark DataFrame API也允许DataFrames数据间的拼接关联。在这个例子中,我们有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中输出如下:

如果我们想持久化保存计算结果,可以使用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会创建一个新表或者替换掉已存在的旧表,来存储生成的数据:

结语

Snowpark为数据处理提供了丰富的操作和工具。它允许用户创建非常复杂的高级数据处理管道操作。将用户自定义的代码推到Snowflake数据仓库服务端,并通过减少不必要的数据传输,在数据端执行,这是Snowpark的一个非常强大的特性。

译者介绍

卢鑫旺,社区编辑,半路出家的九零后程序员。做过前端页面,写过业务接口,搞过爬虫,研究过JS,有幸接触Golang,参与微服务架构转型。目前主写Java,负责公司可定制化低代码平台的数据引擎层设计开发工作。

原文标题:Snowflake Data Processing With Snowpark DataFrames,作者:Istvan Szegedi

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/273389.html<

(0)
运维的头像运维
上一篇2025-05-09 06:10
下一篇 2025-05-09 06:11

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注