注:本記事は(2021年6月15日)に公開された(Welcome to Snowpark: New Data Programmability for the Data Cloud)を翻訳して公開したものです。

当社は、Snowflake Summit 2021において、SnowparkとJava関数のカスタマー向けロールアウトが開始されることを発表しました。そして今、これらの機能がプレビュー版として本日よりAWSのすべてのカスタマー向けに提供されることになりました。

これらの機能はデータプログラマビリティへの新しい大きな一歩となるもので、カスタマーはSnowflakeのプラットフォームを利用して、簡単により多くのことを実行できるようになります。

ベースキャンプ

Snowflakeは、ビッグデータを管理するデータウェアハウスの世界を根本的に再考するところからデータクラウドへの旅路を歩み始めました。これは決して簡単な仕事ではなく、クラウドに向けて信頼性が高く、安全で、高性能で、スケーラブルなデータ処理システムをどのように構築するかを、一から十まで見直す必要がありました。

Snowflakeは、データクラウドを育てていく上での必然として、ユーザーがもっと幅広い方法でシステムとやり取りできるようにする必要がありました。データウェアハウスの世界ではSQLが共通語ですが、開発者の中にはSQLでプログラムを書くことを好まない人もいます。また、そもそもSQLはデータプログラマビリティの問題のすべてに対応できるわけではありません。加えて、データウェアハウスシステムでは、ユーザーが実行できる操作の種類が限られます。その結果ユーザーはタスクに応じてデータを他のシステムに移さなければならず、コスト、時間、複雑さが増し、セキュリティやガバナンスが低下します。

ではどうしたらよいでしょう?選択肢の1つは、これらの新しいシナリオに対応する新しいシステムを作り上げることです。しかしこのアプローチでは、管理すべきシステムが増え、ユーザーは各タスクまたはタスクの各部分で使用するシステムを選ばなければならなくなり、コラボレーションしたいときは各ユーザーのそれぞれのシステムを統合する必要が生じます。

つまり、複雑さが増すということです。これはSnowflakeのやり方ではありません。

そこでSnowflakeは、データウェアハウスのためにSnowflakeのシンプルさとパワーをどう維持するかについて熟考しつつ、より広範なデータプログラマビリティのため、エンジンに拡張機能を構築しました。さらに当社は、より多くの人々がSnowflakeから直接タスクを遂行できるよう、深く合理的な言語統合を可能にするライブラリについても検討しました。

Snowflakeのデータクラウドは、データウェアハウスシステムの規模を大きく広げました。信頼性、セキュリティ、性能、そして拡張性が高い、単一のシンプルでシームレスなシステム。それがSnowflake流です。

これらの新機能について、また将来予定されている機能について、これから詳しく説明していきます。

Snowpark

Snowparkは、Scalaなど開発者が好む言語を使用した、深く統合されたDataFrame式のプログラミングを可能にする、新しい開発者向けツールです。Snowparkは、複雑なデータパイプラインを簡単に構築できるよう、また開発者がデータを移動させることなく直接Snowflakeとやり取りできるようデザインされています。

それでは、Snowparkの特長をいくつかご紹介しましょう。

Snowparkを使用すると、下記のように開発者はコード内でDataFrameを用いてクエリを構築できるため、SQL文を作成して渡す必要がありません。

val sess = // get connection to Snowflake
 
val sales:DataFrame = sess.table("sales")
val line_items:DataFrame = sess.table("sales_details")
 
val query = sales.join(line_items, sales("id") === line_items("sid"))
                 .groupBy(line_items("product_id"))
                 .count()

Snowparkは第一級言語構文を使用しており、タイプチェック、IntelliSense、エラーレポートなど、開発環境から第一級のサポートが得られます。背後では、SnowparkがこれらのオペレーションをSnowflake内で実行されるSQLに変換します。変換には、皆さまがご存知の高性能で拡張性の高いエンジンが用いられます。

しかし、Snowparkはクエリを書くのに便利なツールというだけではありません。たとえば個人を特定できる情報(PII)をマスクするためのカスタムコードなど、独自のカスタムロジックを持ち込むことができます。

val maskPii = (s:String) => {
  // Custom PII detection logic.
}

Snowparkでは、特定のコードをユーザー定義関数(UDF)であると宣言しておくだけで、DataFrameオペレーションにおいてそれを利用できるため、非常に簡単です。

val maskPiiUdf = udf(maskPii)
sess.table("emails")
    .withColumn("body", maskPiiUdf(col("body")))
    .show()

SnowflakeへのロジックはすべてSnowparkがプッシュし、データのすぐ横に配置します。このコードをホストするため、Snowflakeのウェアハウス内には、サンドボックス式のセキュリティ保護されたJVM(後述)が構築されています。

それだけではありません。たとえばPII検出ロジックをテーブル内のすべての文字列カラムに適用するとしましょう。SQLの場合、各テーブルに対してクエリを手動で作成する、つまりクエリを生成するためのコードを書かなくてはなりませんが、Snowparkを使用すれば、汎用ルーチンを簡単に書くことができます。

val maskTable = (df:DataFrame) => {
  df.select(df.schema.map(field => 
    if (field.dataType == StringType) maskPiiUdf(col(field.name))
    else col(field.name))
  )
}

そしてこの汎用ルーチンがあれば、任意のテーブルのPIIのすべてを簡単にマスクできます。

val maskedEmails = maskTable(sess.table("emails"))

Snowparkは、堅牢かつスキーマ主導の方法で適切なクエリを動的に生成します。

言語の統合、カスタムロジックのプッシュダウン、非常に柔軟なクエリ生成といった機能により、Snowparkは非常に強力なデータプログラマビリティツールとなっており、非常に複雑なデータパイプラインを簡単に書くこともできます。

Java関数

上記のとおり、SnowparkはカスタムロジックをSnowflakeにプッシュし、データのすぐ横で実行できます。このとき、コードはSnowflakeのウェアハウス内でホストされている安全なサンドボックス式のJVM内で実行されます。

しかし気配りはSnowpark開発者に対してだけではありません。SQLは依然としてSnowflakeの屋台骨であるため、SQLユーザーもプラットフォームの新機能のあらゆるメリットを活用できるようにし、その仕組みにJava関数という名前を付けました。

Java関数を使用することで、開発者は次のようにシンプルな関数インターフェイスで複雑なロジックを構築できます。

public class Sentiment
{
   public float score(String text)
   {
       // Your sentiment analysis logic here.
   }
}

開発者は、これらの関数を構築するにあたって、ソースコントロール、開発環境、デバッグツールなど、既存のツールセットをフル活用できるほか、ライブラリを持ち込むこともできます。GitHubで便利なコードを見つけた場合、もちろんSnowflakeで利用できます。

SQLを使用するために必要なことは、JAR(1つまたは複数)を構築して、Snowflakeにロードし、関数を登録するだけです。

create function sentiment(txt string) returns float
language java
imports = ('@jars/Sentiment.jar')
handler = 'Sentiment.score'; 

それに加えて、どのSQLユーザーも、他の関数と同様、自分で構築したロジックを使うことができます。

select id, sentiment(body)
from emails;

これは非常に簡単です。しかも、開発者が自前のツールを使用できるというのは、複雑なケースの場合にとても便利です。もちろん基本的なことにも対応できるよう、シンプルなインライン定義も追加しておきました。

create or replace function reverse(s string) returns string
language java
handler = 'Reverse.reverse'
target_path = '@jars/Reverse.jar'
as
$$
public class Reverse
{ 
    public String reverse(String s)
    {
        return new StringBuilder(s).reverse().toString();
    }
}
$$;

強力なJava関数とSnowflakeのシンプルさ。しかしこれだけではありません。

Snowpark Accelerated

これまで、SnowparkとJava関数を使用していかにパワフルなことができるかについて、例をいくつか見てきました。これらの機能は今後の可能性を大きく広げてくれるものですが、私たちはパートナーコミュニティ内で見られる関心の高さにも胸を躍らせています。

今回のローンチの一環として、当社はSnowpark Acceleratedプログラムを立ち上げました。このプログラムは、パートナー各社が当社の機能を活用して作り上げている素晴らしい製品にスポットライトを当て、サポートすることを目的とするものです。これまでに、約50社に上るパートナー企業にご参加いただいています。

パートナーが作り上げてきた驚くべき製品を目にするのは素晴らしいことです。たとえば、高速なデータベース内モデルスコアリングのためのシームレスな機械学習パイプラインの構築。自然言語処理、データ品質管理、およびデータへのプロファイリングルーチンの導入。さらに、SQLで実現することが難しいビジュアルクエリフローを用いた分析ダッシュボードの開発や世代のETLの強化などが挙げられますが、これらはほんの一例にすぎません。

長い道のり

使用を開始するには、まずSnowparkJava関数に関するドキュメンテーションを読み、さらにSnowparkの使用開始方法を段階的に説明したラボガイドの手順に従ってください。皆さまがSnowparkを活用して構築した驚きの成果物を目にするのが楽しみです。

さて、皆さまがこれらの新しい機能について学んでいる間にも、私たちはすでに次のラウンドに進んでいます。Summitでは、ロギングへの対応、テーブル関数、ファイルへの対応など、当社がすでに着手しているいくつかのエンハンスメントについて説明させていただきました。

当社はまた、Snowparkストアドプロシージャにも取り組んでいます。これはご自身が作成したSnowparkパイプラインをSnowflake内でホストし、スケジューリングやオーケストレーションをすることを可能にするものです。当社にはその他にも秘策がいくつかあります。

私たちはこの長い道のりに乗り出したばかりです。共に歩んでくださる皆さまに感謝いたします。