用Snowpark DataFrames进行Snowflake数据处理

743 阅读5分钟

DZone>大数据专区>用Snowpark DataFrames进行雪花数据处理

使用Snowpark DataFrames的Snowflake数据处理

Snowpark是Snowflake中的一个新的开发者库,它提供了一个API来使用Scala(以及后来的Java或Python)等编程语言来处理数据,而不是SQL。

Istvan Szegedi user avatar通过

Istvan Szegedi

-

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上的热门话题


评论

大数据 合作伙伴资源