本発明は、処理、装置、システム、物質の組成、コンピュータ読み取り可能な格納媒体上に具現化されたコンピュータプログラム製品、および/または、プロセッサ(プロセッサに接続されたメモリに格納および/またはそのメモリによって提供される命令を実行するよう構成されたプロセッサ)を含め、様々な形態で実装されうる。本明細書では、これらの実装または本発明が取りうる任意の他の形態を、技術と呼ぶ。一般に、開示された処理の工程の順序は、本発明の範囲内で変更されてもよい。特に言及しない限り、タスクを実行するよう構成されるものとして記載されたプロセッサまたはメモリなどの構成要素は、ある時間にタスクを実行するよう一時的に構成された一般的な構成要素として、または、タスクを実行するよう製造された特定の構成要素として実装されてよい。本明細書では、「プロセッサ」という用語は、1または複数のデバイス、回路、および/または、コンピュータプログラム命令などのデータを処理するよう構成された処理コアを指すものとする。
以下では、本発明の原理を示す図面を参照しつつ、本発明の1または複数の実施形態の詳細な説明を行う。本発明は、かかる実施形態に関連して説明されているが、どの実施形態にも限定されない。本発明の範囲は、特許請求の範囲によってのみ限定されるものであり、本発明は、多くの代替物、変形物、および、等価物を含む。以下の説明では、本発明の完全な理解を提供するために、多くの具体的な詳細事項が記載されている。これらの詳細事項は、例示を目的としたものであり、本発明は、これらの具体的な詳細事項の一部または全てがなくとも特許請求の範囲に従って実施可能である。簡単のために、本発明に関連する技術分野で周知の技術事項については、本発明が必要以上にわかりにくくならないように、詳細には説明していない。
本明細書に記載の技術を用いると、順序付けされたデータ準備動作(すなわち、順番に適用される一連の動作)をデータセットに実行して変換結果を生成するために、Apache Spark(商標)などの分散型コンピュータプラットフォームを効率的に利用できる。本明細書で用いられるように、データ準備動作とは、入力データを変換/変化させるために用いられる動作のことである。入力データは、順序付けされた動作のセットの実行時に動的にアクセス可能であり、ここで、データは、必ずしも格納されておらず、必要に応じてオンザフライで計算されてもよい。これは、固定された既知の位置に格納されたデータに対する動作と対照的であり、事前のインデックス化およびパーティショニングの利点なしに実行される。入力データは、(例えば、行および列に)構造化されたデータを含む。データ準備動作の様々な例は、クラスタリング、結合、付加、ソート、大文字化、小文字化、フィルタリング、重複排除、グループ分け、列の追加または除去、行の追加または除去、ピボッティング、デピボッティング、順序依存の動作などを含む。変換結果の表現は、本明細書では「データトラバーサルプログラム」と呼ばれており、これは、変換結果を引き出すために入力データ内の1または複数の影響を受けた列をどのように集めるのかを示す。変換結果の表現は、対応する動作シグネチャと共に再利用に向けて格納されることが可能であり、それによって、キャッシュされた結果が、再利用のために特定および取得されることが可能になる。
データ準備のためのキャッシュ最適化が開示されている。いくつかの実施形態において、1または複数セットのデータに実行された順序付けされたデータ準備動作のセットの結果を表すデータトラバーサルプログラムが生成される。データトラバーサルプログラムは、結果を引き出すために1または複数のデータセット内で1または複数の影響を受けた列をどのように集めるのかを示す。データトラバーサルプログラムは、参照および参照スタックを含んでおり、それらについては、後に詳述する。データトラバーサルプログラムが格納される。1または複数のデータセットに実行される順序付けられた動作のセットの仕様がその後に受信されると、データトラバーサルプログラムがリトリーブされる。1または複数のデータセット内の1または複数の影響を受けた列は、結果を生成するために、データトラバーサルプログラムに従って集められる。次いで、その結果は、例えば、グラフィカルユーザインターフェースで見られるように、または、ファイルに発行されるように、出力として提供されうる。
図1は、いくつかの実施形態に従って、データ準備のためのキャッシュ最適化を実行するためにプログラムされたコンピュータシステムを示す機能図である。明らかに、自動結合検出を実行するために、他のコンピュータシステムアーキテクチャおよび構成を用いることも可能である。以下に述べるような様々なサブシステムを備えるコンピュータシステム100は、少なくとも1つのマイクロプロセッササブシステム(プロセッサまたは中央処理装置(CPU)とも呼ばれる)102を備える。例えば、プロセッサ102は、シングルチッププロセッサまたはマルチプロセッサによって実装できる。いくつかの実施形態において、プロセッサ102は、コンピュータシステム100の動作を制御する汎用デジタルプロセッサである。メモリ110から読み出された命令を用いて、プロセッサ102は、入力データの受信および操作、ならびに、出力デバイス(例えば、ディスプレイ118)上でのデータの出力および表示を制御する。いくいくつかの実施形態において、プロセッサ102は、図2のパイプラインサーバ206を含む、および/または、それらを提供するために用いられる、ならびに/もしくは、処理500、1300、1400、および/または、1600を実行/実施する。
プロセッサ102は、メモリ110と双方向的に接続されており、メモリ110は、第1のプライマリストレージ(通例は、ランダムアクセスメモリ(RAM))および第2のプライマリストレージ領域(通例は、リードオンリーメモリ(ROM))を含みうる。当業者に周知のように、プライマリストレージは、一般的な記憶領域として、および、スクラッチパッドメモリとして利用可能であり、また、入力データおよび処理済みデータを格納するために利用可能である。プライマリストレージは、さらに、プロセッサ102上で実行される処理のための他のデータおよび命令に加えて、データオブジェクトおよびテキストオブジェクトの形態で、プログラミング命令およびデータを格納できる。また、当業者に周知のように、プライマリストレージは、通例、機能(例えば、プログラムされた命令)を実行するためにプロセッサ102によって用いられる基本的な動作命令、プログラムコード、データ、および、オブジェクトを備える。例えば、メモリ110は、例えば、データアクセスが双方向である必要があるか、単方向である必要があるかに応じて、後述する任意の適切なコンピュータ読み取り可能な記憶媒体を含みうる。例えば、プロセッサ102は、頻繁に必要になるデータをキャッシュメモリ(図示せず)に直接的かつ非常に迅速に格納し取り出すことができる。
着脱可能マスストレージデバイス112が、コンピュータシステム100にさらなるデータ記憶容量を提供しており、プロセッサ102に対して双方向(読み出し/書き込み)または単方向(読み出しのみ)に接続されている。例えば、ストレージ112は、磁気テープ、フラッシュメモリ、PCカード、携帯型マスストレージデバイス、ホログラフィックストレージデバイス、および、その他のストレージデバイスなどのコンピュータ読み取り可能な媒体も含みうる。固定マスストレージ120も、例えば、さらなるデータ記憶容量を提供しうる。マスストレージ120の最も一般的な例は、ハードディスクドライブである。マスストレージ112、120は、一般に、プロセッサ102によって通例はあまり利用されないさらなるプログラミング命令、データなどを格納する。マスストレージ112および120に保持された情報は、必要であれば、仮想メモリとしてのメモリ110(例えば、RAM)の一部に標準的な方式で組み込まれうることが理解される。
プロセッサ102にストレージサブシステムへのアクセスを提供することに加えて、バス114は、その他のサブシステムおよびデバイスへのアクセスを提供するために用いられてもよい。図に示すように、これらは、ディスプレイモニタ118、ネットワークインターフェース116、キーボード104、および、ポインティングデバイス106、ならびに、必要に応じて、補助入力/出力デバイスインターフェース、サウンドカード、スピーカ、および、その他のサブシステムを含みうる。例えば、ポインティングデバイス106は、マウス、スタイラス、トラックボール、または、タブレットであってよく、グラフィカルユーザインターフェースと相互作用するのに有用である。
ネットワークインターフェース116は、図に示すように、ネットワーク接続を用いて、別のコンピュータ、コンピュータネットワーク、または、遠隔通信ネットワークにプロセッサ102を接続することを可能にする。例えば、ネットワークインターフェース116を通して、プロセッサ102は、方法/処理ステップを実行する過程で、別のネットワークから情報(例えば、データオブジェクトまたはプログラム命令)を受信したり、別のネットワークに情報を出力したりすることができる。情報は、しばしば、プロセッサ上で実行される一連の命令として表され、別のネットワークから受信されたり、別のネットワークへ出力されたりしうる。インターフェースカード(または同様のデバイス)と、プロセッサ102によって実装(例えば、実行/実施)される適切なソフトウェアとを用いて、コンピュータシステム100を外部ネットワークに接続し、標準プロトコルに従ってデータを転送することができる。例えば、本明細書に開示された様々な処理の実施形態は、プロセッサ102上で実行されてもよいし、処理の一部を共有するリモートプロセッサと共に、ネットワーク(インターネット、イントラネットワーク、または、ローカルエリアネットワークなど)上で実行されてもよい。さらなるマスストレージデバイス(図示せず)が、ネットワークインターフェース116を通してプロセッサ102に接続されてもよい。
補助I/Oデバイスインターフェース(図示せず)が、コンピュータシステム100と共に用いられてよい。補助I/Oデバイスインターフェースは、プロセッサ102がデータを送信すること、ならびに、より典型的には、他のデバイス(マイクロフォン、タッチセンサ方式ディスプレイ、トランスデューサカードリーダ、テープリーダ、音声または手書き認識装置、バイオメトリクスリーダ、カメラ、携帯型マスストレージデバイス、および、他のコンピュータなど)からデータを受信することを可能にする汎用インターフェースおよびカスタマイズされたインターフェースを含みうる。
さらに、本明細書に開示された様々な実施形態は、さらに、様々なコンピュータ実装された動作を実行するためのプログラムコードを備えたコンピュータ読み取り可能な媒体を含むコンピュータストレージ製品に関する。コンピュータ読み取り可能な媒体は、データを格納できる任意のデータストレージデバイスであり、そのデータは、後にコンピュータシステムによって読み出されうる。コンピュータ読み取り可能な媒体の例は、上記の媒体すべてを含むがそれらに限定されない:ハードディスク、フロッピーディスク、および、磁気テープなどの磁気媒体;CD−ROMディスクなどの光学媒体;光学ディスクなどの磁気光学媒体;ならびに、特定用途向け集積回路(ASIC)、プログラム可能論理デバイス(PLD)、および、ROM/RAMデバイスなど、特別に構成されたハードウェアデバイス。プログラムコードの例としては、例えば、コンパイラによって生成されるマシンコード、または、インタープリタを用いて実行できる高水準コード(例えば、スクリプト)を含むファイルが挙げられる。
図1に示すコンピュータシステムは、本明細書に開示された様々な実施形態と共に利用するのに適切なコンピュータシステムの一例にすぎない。かかる利用に適した他のコンピュータシステムは、より多いまたは少ないサブシステムを含みうる。さらに、バス114は、サブシステムをつなぐよう機能する任意の相互接続スキームの例である。異なる構成のサブシステムを有する他のコンピュータアーキテクチャが利用されてもよい。
図2は、データ準備のためのシステムの一実施形態を示すシステム図である。システムは、フロントエンド200およびパイプラインサーバ206を備える。
フロントエンド200は、データ準備を設定するためのインターフェースを提供するよう構成されている。フロントエンド200は、パイプラインサーバ206と相互作用する。様々な実施形態において、フロントエンド200は、クライアントデバイス上で動作し、J2EEアプリケーションサーバ(TomcatまたはJettyもしくはそれらの組みあわせなど)としてのパイプラインサーバと通信するスタンドアローンのアプリケーションおよび/またはブラウザベースのクライアントアプリケーションとして実装されうる。フロントエンド200は、ユーザインターフェースエンジン202およびスクリプトジェネレータ204を備える。
ユーザインターフェースエンジン202は、テーブルデータ、構成オプション、順序付けられた動作の結果、および、任意のその他の適切な情報をユーザインターフェーススクリーンでユーザに提示するため、ならびに、ユーザインターフェース構成要素からユーザ入力を受信するために、パイプラインサーバ206と相互作用するよう構成されている。例えば、ユーザインターフェースエンジン202は、1または複数の変換結果を生成するために1または複数のデータセットに実行されるデータ準備動作セットをユーザが指定するためのエディタユーザインターフェースを提供するよう構成されている。指定された一連の順序付けられた動作(指定された順番に適用される)は、1または複数のデータセットが処理されるパイプラインを形成する。データセットは、行および列に構造化されたデータレコードを含むデータのテーブルを含む。ユーユーザインターフェースエンジン202によって提供されるユーザインターフェースの例については、図15A〜Eを参照して説明する。
スクリプトジェネレータ204は、ユーザインターフェースエンジン202によって提供される1以上のユーザインターフェースを用いてユーザによって指定されたデータセットおよび一連の動作に基づいて、スクリプトを生成するよう構成されている。スクリプトは、処理を受ける1または複数のデータセットならびに1または複数のデータセットに実行されるよう指定された順序付けられた動作のセットの仕様を含むフォーマットされた命令のセットを含む。いくつかの実施形態において、スクリプト内で指定されたパイプラインは、アプリケーションと呼ばれる。スクリプトジェネレータ204を用いて生成されたスクリプトの一例について、図6Aを参照して説明する。
パイプラインサーバ206は、データ準備を実行するよう構成されている。いくつかの実施形態において、パイプラインサーバは、スクリプトジェネレータ204からスクリプトを受信し、そのスクリプトに従って1または複数の入力データセット(例えば、データセット214)に、(パイプラインを形成する)順序付けられたデータ準備動作のセットを実行する。データセットは、メモリ(例えば、ランダムアクセスメモリ)に格納されるか、ストレージ(例えば、ローカルディスク、ネットワークストレージ、分散型ストレージサーバなど)から読み出しまたはストリーミングされるか、もしくは、任意の他の適切なソースから取得されてよい。パイプラインサーバ206は、ネットワークベース/クラウドベース環境内の1または複数のサーバ、クライアントデバイス(例えば、コンピュータ、スマートフォン、ウェアラブルデバイス、または、通信機能を備えたその他の適切なデバイス)、もしくは、それらの組みあわせ上に実装されてよい。いくつかの実施形態において、パイプラインサーバは、アプリケーションとして配備される。パイプラインサーバは、システム(100など)を用いて実装されうる。いくつかの実施形態において、パイプラインサーバは、Apache Spark(商標)などの分散型コンピュータプラットフォームを用いて実装される。Apache Spark(商標)を含む実施形態の例を以下に記載するが、本明細書に記載の技術を適切に適合させて、任意のその他の分散型コンピュータプラットフォーム/アーキテクチャを利用することができる。パイプラインサーバ206は、データ分割エンジン208、データ変換エンジン210、および、キャッシュエンジン212を備える。
データ分割エンジン208は、入力データセット(例えば、データセット214)を分割して、分散型コンピュータ環境内の処理ノードクラスタにそれらを分配するよう構成されている。いくつかの実施形態において、データ分割エンジンは、Apache Spark(商標)などの分散型コンピュータプラットフォームに提供できる形態に変換できるように、入力データを事前処理するよう構成されている。データセット内のデータの分配を決定することは、取得されたデータセットが、どのように論理パーティション/作業部分に分割/パーティショニングされるべきかを決定することを含み、いくつのパーティションが生成されるべきか、および、各パーティションを割り当てる負荷を決定することを含む。いくつかの実施形態において、パーティション決定は、様々なコスト関数に基づいている。データ分割エンジンの動作については、後に詳述する。
データ変換エンジン210は、データ準備を実行するよう構成されている。データ準備を実行することは、1または複数のデータセットに順序付けられたデータ準備動作のセットを実行することによって、変換結果を決定することを含む。いくつかの実施形態において、データ変換エンジンは、列データ変換エンジンである。いくつかの実施形態において、データ変換エンジンは、さらに、再利用に向けて、結果のキャッシングと、既存のキャッシュされた結果のルックアップとを実行するよう構成される。
以下に述べるように、データ変換エンジンは、1または複数のデータセットに対する順序付けられた動作のセットの変換結果のコンパクト表現(本明細書では「データトラバーサルプログラム」と呼ぶ)を生成することによって、順序付けられたデータ準備動作を効率的に実行するよう構成される。データトラバーサルプログラムは、列ファイルと共に用いられた時に、変換結果を引き出すために処理を受けた1または複数のデータセット内の1または複数の影響を受けた列をどのように集めるのかを示す参照および参照スタックを含む。データ変換エンジンの動作については、後に詳述する。
キャッシュエンジン212は、キャッシングおよびキャッシュ識別を実行するよう構成されている。例えば、データ変換エンジン210を用いて決定されたデータトラバーサルプログラム/結果の表現は、再利用に向けて様々な時点(例えば、特定の一部の順序付けされたデータ準備動作の後)にキャッシュされうる。キャッシングされているデータは、例えばメモリ(例えば、ランダムアクセスメモリ)内のキャッシュ層、ローカルストレージデバイスまたはネットワークストレージデバイス(例えば、ディスクまたはストレージサーバ)、および/または、任意の他の適切なデバイスに格納されうる。結果は、例えば、ユーザからの(例えば、ユーザインターフェースエンジン202によって提供されたステップエディタユーザインターフェースとの相互作用による)明示的な要求に基づいてキャッシュされうる。結果は、例えば、結果に到達するために実行された動作の複雑性などの要因に基づいて、自動的にキャッシュされてもよい。キャッシュされた表現は、対応するシグネチャに基づいて識別されうる。例えば、キャッシュエンジンは、(例えば、ユーザインターフェースエンジンによって提供されたステップエディタユーザインターフェースを介してユーザ入力から生成されたスクリプト内で受信された)順序付けられた動作のセットを入力として、動作シグネチャを導出し、既存のキャッシュされた結果に関連するシグネチャとそれを比較することができる。キャッシュエンジンの動作については、後に詳述する。
図3は、パイプラインサーバの一実施形態を示すシステム図である。いくつかの実施形態において、パイプラインサーバ300は、図2のパイプラインサーバ206の一例である。この例において、パイプラインサーバ300は、分散型コンピュータプラットフォームを用いて実装される。いくつかの実施形態において、パイプラインサーバ300の分散型コンピュータプラットフォームは、図2のデータ分割エンジン208、データ変換エンジン210、および、キャッシュエンジン212を実装するために用いられる。
パイプラインサーバ300内に示されているのは、Sparkクラスタの実施形態の一例である。クラスタは、Sparkマスタ(302)およびSparkワーカ(304および312)を備える。いくつかの実施形態において、Sparkクラスタは、マスタスレーブアーキテクチャを用いて実装される。いくつかの実施形態において、Sparkマスタは、(おそらく分散的に)実行されるすべての作業を調整するよう構成されている。いくつかの実施形態において、Sparkワーカは、実行すべき動作に関する命令と共に或るデータを指す複数の作業を受信して実行する責任がある。Sparkマスタおよびワーカは、例えば、Java(登録商標)アプリケーションとして実装できる。
いくつかの実施形態において、Sparkマスタは、外部クライアントから要求(例えば、ジョブ)を受信するよう構成されている。Sparkマスタは、より小さいチャンク(作業部分)にジョブを分解し、様々なSparkワーカに作業を分散させるよう構成される。Sparkワーカは、自身の作業の部分を完了させると、Sparkマスタに結果を返す。ワーカすべてがそれぞれの結果を返すと、Sparkマスタは、ワーカの結果すべてをコンパイルし、要求側クライアントに最終結果を返す。
いくつかの実施形態において、スタンドアローンモードで動作する場合、Sparkマスタは、ワーカの健全性/状態を追跡して作業スケジュールを管理するよう構成される。
いくつかの実施形態において、Sparkマスタおよびワーカの両方は、コンパニオンアプリケーション(例えば、専用のSparkアプリケーション)を用いて、実際の作業を実行する。いくつかの実施形態において、コンパニオンアプリケーションは、Sparkプロセスを実行する全マシン(マスタおよびワーカの両方)上で動作する。ワーカマシン上で動作するコンパニオンアプリケーション(本明細書では「パイプライン」アプリケーションとも呼ぶ)のランタイムインスタンスを、本明細書ではSpark「パイプラインエグゼキュータ」と呼ぶ。Sparkワーカは、エグゼキュータアプリケーションを通してそのジョブを実行するよう構成される。
この例では、2つのSparkワーカが図示されているが、任意の数のSparkワーカが、クラスタ内に確立されてよい。いくつかの実施形態では、アプリケーション(例えば、フロントエンド200などのフロントエンドによって開始されたデータ準備アプリケーション)が、データセットが通されるパイプラインを含む順序付けられた動作のセットを実行するために、ノードのクラスタを準備する。いくつかの実施形態において、各Sparkマスタまたはワーカは、様々な実施形態において、デバイス、プロセッサ、サーバなどとして実装された、物理コンピュータまたは仮想コンピュータのいずれかを備えたノードである。
この例において、Sparkマスタは、「パイプラインマスタ」(308)と通信するよう指定され、Sparkワーカは、パイプラインエグゼキュータ(310および306)と通信するよう指定される。パイプラインマスタ/エグゼキュータは、対応するノード上にあるSparkソフトウェアと接続する。
上述のように、パイプラインサーバは、1または複数の入力データセットと、入力データセットが処理されるパイプラインを形成する順序付けられたデータ準備動作のセットとを指定するスクリプトを受信する。パイプラインサーバは、分散型コンピュータプラットフォームを用いて、受信したスクリプトに従って入力データを処理する。
データ分割
この例において、パイプラインマスタは、入力データセットの分割を実行するよう構成される。いくつかの実施形態において、パイプラインマスタは、図2のデータ分割エンジン208を実装するために用いられる。分割は、データセットをより小さいチャンクに分割すること(例えば、100行のデータセットをそれぞれが20行を含む5つのパーティションに分割すること)を含む。いくつかの実施形態において、データのセットは、複数の作業部分、すなわち、実行される複数の作業に分割される。パイプラインマスタは、さらに、処理に向けて準備されたクラスタ内の様々な確立したパイプラインエグゼキュータにパーティションを分散させるよう構成される。Spark実装例において、データセットの区分/パーティション(「作業の部分」または「作業部分」とも呼ぶ)は、耐障害性分散データセット(RDD:Resilient Distributed Dataset)として表現される。他の分散型プラットフォーム実装例については、他のパーティションフォーマットも可能である。
データの分割時、いくつのパーティションを生成すべきか、および/または、各パーティションに何行/どれだけを含めるのか、を決定する際に、様々なトレードオフが存在する。例えば、データのスライス数の増加は、並列性および計算速度の増大につながりうるが、パーティションの数の増加は、ますます多くのノード間でデータが通信される必要があることから、オーバーヘッドの増大および通信帯域要件の増加にもつながる。これにより、非効率になりうる。本明細書に記載の技術を用いれば、分割を最適化できる。例えば、パーティションの最適数および/またはパーティション当たりの行の最適サイズ/数を決定できる。
マスタノードは、様々な情報を考慮することによって、データセットを分割するためのインテリジェントな戦略を考案または利用するよう構成される。様々な実施形態において、考慮される情報は、処理を受けるデータ、実行されるデータ準備動作、分散型コンピュータ環境のトポロジ/パフォーマンス特性などに関する情報を含む。かかる情報を考慮することにより、ノードがほぼ同時に処理を完了できるように、例えば、クラスタのノード全体にわたる信頼性の高いスループットのために、最適化を行う分割戦略が考案されうる。したがって、(例えば、いくつかのワーカが、その他のワーカと比較して、自身の作業の部分を実行するのにより多くの時間を費やしており、それを待つ必要がある場合に)、例えば、分散型計算環境における遅れを低減できる。
処理を受けるデータに関する情報は、そのデータに関するメタデータ情報を含む。実施形態の一例において、Spark(パイプライン)マスタは、(例えば、受信したスクリプトに記載されたソース位置から取得した)入力データセットをクエリする。パイプラインマスタは、データセットを記述するメタデータを決定するために、データセットを調べる。様々な実施形態において、メタデータは、データセット内にある行の数、データセット内にある列の数などを含む。いくつかの実施形態において、決定/生成されたメタデータは、データがデータセット内でどのように分布するかに関するヒストグラム情報など、統計情報を含む。例えば、データセット内のいくつかの行が他の行よりも密度が高いと決定されうる。分析(例えば、統計分析)の結果として決定されたメタデータは、インテリジェントな分割戦略を考案するために、パイプラインマスタによって部分的に用いられる。
分割戦略の実施形態の例について、以下に記載する。
戦略例1:行カウントに基づく分割
この戦略例において、データセットは、このコンテクストフリーなアプローチ(例えば、行に関するメタデータ情報も他の情報も利用されない)において、各Sparkワーカ/パイプラインエグゼキュータが、固定された(例えば、同じ)数の行を与えられるように、行カウントに基づいて分割される。いくつかの実施形態では、各行を処理するのに同じ量のリソースおよび時間を要すると仮定される。
戦略例2:行のサイズ/データの量に基づく分割
この戦略例において、データセットは、データセット内の行のサイズに部分的に基づいて分割される。データセットの行におけるデータの密度および/または量(例えば、データの量は、行ごとに変化しうる)を決定するために、統計分析がデータに実行される。例えば、行が必要とする空間の量を示すメタデータが決定される。データセットは、各パーティションが同じ量のデータを含む(ただし、様々な数の行を含んでよい)ように分割される。
いくつかの実施形態において、行の数は、行のサイズに加えて、二次的な基準として用いられる。例えば、所与の量のデータサイズを有する行の数が、パーティションに対して決定される。行の数が閾値行数を超えた場合(または、平均行数からの閾値逸脱数よりも大きい場合)、パーティション内の行の数は、削減され、閾値を上限とされる。例えば、各パーティションは、100MBのデータまたは200,000行、いずれか行数が少ない方を割り当てられる。
二次的な基準としての行数の利用は、データ変換の列の性質に部分的に基づいており、ここで、データは、1または複数の特定の列に関して実行されたデータ準備動作に基づいて変換され、動作を実行するのに必要な計算量を決定するデータ準備動作の影響を受けるのはそれらの列である。しかしながら、1つの行が、データセットのすべての列内のデータセルを含み、行のサイズは、動作のコストに実質的に寄与しない列にあるデータセルに凝縮されてよい。二次的な基準として行数を用いることにより、サイズの点で外れ値の分布を有する列を削除できる(最も一般的なデータ準備が、分布内で極めて均一であるデータに作用していると仮定する)。これは、分散型計算システムにおいて最終的にどれだけのデータが処理されるのかについて、リミッタを提供する。
いくつかの実施形態において、パーティション当たりの行の上限/最大数は、データセット全体の総行数の関数として決定される。3部分の関数の一実施形態を示すプロットの一例を図4に示す。図に示された線分の傾きおよび遷移点は、経験的に決定されており、異なる実施形態において様々であってよい。この例で、行数が範囲402に収まるデータセットについては、パーティションに、データセットの総行数の内の比較的大きい割合が備えられる。例えば、非常に小さいデータセットについては、単一のパーティションに、全データが詰め込まれる。そうすることにより、データをパーティションにわたって(潜在的に、異なるノードに)分散させる必要はなく、リソースオーバーヘッドが低減される。したがって、この第1領域402では、小さい入力データセットについて、データセットをより少ないパーティションに分割した方が効率的である。換言すると、分割技術は、より多くの行を単一のパーティションに入れようとする。
範囲404の総行数を持つデータセットについては、総行数が増加する(ここで、各パーティションのサイズは、徐々に大きくなる)につれて、新たなパーティションが徐々に追加される。範囲402と比較して、範囲404では、行がパーティションに追加される速度は遅い。例えば、この範囲では、新たなパーティションを追加する方が、それらのパーティションに行を追加するよりも好ましい。行がまだ徐々にパーティションに追加されている間(これは、ノード上のいくつかのパーティションの性能を犠牲にしうる(ノードがより多い行データを処理しなければいけなくなるため))、それらのパーティションは、処理されるパーティションの数が多くなりすぎないような速度で追加される。
総行数が閾値406を超えるデータセットについては、1つのパーティションに含まれうる行の数は、凍結されて増加せず、ここで、さらなるパーティションの追加が好ましい。したがって、単一のパーティションに含まれうる行の数に関する上限が確立され、各パーティションが比較的一定した時間で限界(上限)量のデータを処理できるのを知ることが可能になる。
戦略例3:行のアクティブ部分のサイズに基づく分割
この戦略では、戦略2と同様に、パーティションに含めるデータの量が考慮される。ただし、動作(または、順序付けられた動作のセット)に関与する(または、動作の影響を受ける)(すなわち、アクティブである)列内のデータのみが考慮される。例えば、4つのすべての列の内、それらの列の3つのみが、データ準備動作(例えば、これらの3つの列を用いる結合動作)に関与する場合、それら3つの列内のデータのみが決定される。次いで、データセットは、アクティブな列内のデータ量に従って(例えば、戦略2で上述したように)分割される。いくつかの実施形態では、行のアクティブ部分の中のデータの密度が、分割を決定するための別の要素として用いられる。
いくつかの実施形態において、戦略2および3はコンテクストを意識しており、処理されるデータセットの属性および特性を考慮に入れている(例えば、データセットの行に関して決定されたメタデータ情報)。いくつかの実施形態において、コンテクストを意識した戦略は、パーティションが必要とするメモリ量およびパーティションに作用するパイプラインエグゼキュータが対応できるメモリ量など、クラスタの物理特性も考慮に入れる。例えば、パーティションに存在しうるデータの量(メモリサイズ)は、エグゼキュータが利用するために割り当てられるメモリを超えないように設定されうる。考慮されるクラスタのその他の物理特性は、後に詳述するように、処理能力の量、ネットワーク帯域幅メトリクスなど、パフォーマンスメトリクスを含む。
クラスタ内のノードは、様々なパフォーマンス特性を持つ物理マシンであってよい。例えば、クラスタが2つの計算ノードを備えると仮定する。第1ノードは、コア当たり10GBのメモリで、8のプロセッサコアを有しており(すなわち、合計で80GBのメモリ)、一方、第2ノードは、コア当たり10GBのメモリで、16のプロセッサコアを有する(すなわち、合計で160GBのメモリ)。ノードのこれらのメモリ/処理特性に基づくと共に、ワーカがプロセッサコア当たり10GBを割り当てられるというヒューリスティックを用いると、3の倍数であるワーカ数が、2つのノードにわたって作業を実行することが好ましい。これは、第1ノードが総メモリの1/3を有し、第2ノードが総メモリの2/3を有する(すなわち、2つのノードのメモリの比が1:2である)ことで、3の倍数であるワーカ数を有することが、クラスタ内の総メモリ量が完全に利用されることを保証するからである。
しかしながら、クラスタのノードがパフォーマンス特性において様々でありえ、クラスタ構造が変化しうることを考慮すると、いくつかの実施形態において、パーティションの作成は、クラスタの実際の処理能力の明確な知識なしに行われる。むしろ、各パーティションは、コア当たりのメモリ量(例えば、10GB)など、予め指定された計算リソース量を割り当てられる。次いで、データセットは、パフォーマンスヒューリスティック/特性に従って(例えば、10GBの倍数であるチャンクに)分割される。したがって、例えば、パーティションがコア当たり最大10GBのメモリを割り当てられる場合、8コアにわたって80GBの総メモリを備えた第1ノードは、8パーティション/ワーカをサポートできる(ここで、1パーティションが1ワーカに対応する)。この例において、コア当たりのRAM量のプロパティは、タスクに適用できる原理/ヒューリスティックまで還元されている(クラスタの実際のハードウェアの明確な知識なしに)。
いくつかの実施形態において、パーティションが、1つのワーカによって処理され、パーティション/ワーカに割り当てられうるリソースの量は、パーティションに作用しうるワーカユニットのパフォーマンス特性を規定するアトミック計算単位で具現化される。アトミック計算単位は、ワーカ/パイプラインエグゼキュータがパーティションを処理するために有するリソースの量を示す値を持つパフォーマンスメトリクスのセットに関連する。コア当たりのメモリ量に加えて、上述のように、このより高いレベルの形態に還元されうる他の特性は、ネットワーク帯域幅、待ち時間、および、コアパフォーマンスを含む。(パーティションに作用する)単一のワーカユニットに利用可能なリソース量のより高いレベルの視点を定義することにより、パーティション(およびさらなるワーカユニット)を追加するためのリソースのコストを決定することができる。例えば、コスト関数が、パフォーマンス特性/ヒューリスティックのセットを仮定して、結果を計算するコストを決定するために利用されうる。いくつかの実施形態において、(例えば、ワーカが、データのいくらかの行数/量を処理するための)コストの単位が、計算される。次いで、データは、データを処理するのに必要なワーカの数を決定するために、計算されたコストの単位に基づいて分割される。
したがって、アトミックワーカユニットのパフォーマンス特性のより高いレベルの視点を用いて、データセットに働きかけるのに必要なワーカの数を決定することができる(すなわち、データが分割されるべき作業/パーティションの数)。さらに、作成するパーティション/作業の数、対、パーティションに追加する行の数が、計算コストに基づいて評価されうる。
いくつかの実施形態において、データセットを分割する方法の決定は、実行される動作の特性に基づく。例えば、異なるタイプの動作は、異なる計算コストを有することになる。一例として、単一の入力を取り込み、その入力(大文字化動作など)のみに基づいて出力を提供する関数が、一定のコストを有する。互いに通信するためにパーティションを必要としうる他のタイプの動作(ソートなど)は、より大きいコストを有しうる(例えば、ソートについては、logn/パーティション数のオーダー)。次いで、データセットは、受信されたスクリプト内で指定された動作を実行するためのコストに部分的に基づいて分割されうる。
上述の戦略および技術の任意の組みあわせが、コスト関数に従ってデータセットを分割するための戦略を決定するために用いられてよい。いくつかの実施形態において、パーティションは、隣接しており、重複していない。一例として、0から199までインデックス付けされた200行のデータセットが、(例えば、上述の戦略1を用いて)4つの論理パーティションに均等に分割されると仮定する。第1パーティションは、行0〜49を有し、第2パーティションは、行50〜99を有し、第3パーティションは、行100〜149を含み、第4パーティションは、行150〜199を含む。いくつかの実施形態において、パーティションは、パーティションN+1から取得/読み出しされた行が、パーティションNから取得/読み出しされた行に続くように、同様に順序付けされる。したがって、データセットは、順番に各パーティションを読み出すことによって、行順で読み出されうる。次いで、パーティションは、分散型コンピュータ配備アーキテクチャ内のパイプラインエグゼキュータ/Sparkワーカに分散される。例えば、Sparkスケジューラが、パーティション/作業が割り当てられて処理される場所(例えば、ノード)を決定する。
図5は、分割を行うための処理の実施形態の一例を示すフローチャートである。いくつかの実施形態において、処理500は、図2のデータ分割エンジン208によって実行される。処理は、構造化されたデータのセットに実行される順序付けされた動作のセットの仕様が受信される工程502で始まる。いくつかの実施形態において、順序付けられた動作は、データ準備動作を含む。一例として、データのセットは、行および列もしくは任意のその他の適切な次元に構造化されうる。構造化されたデータのセットに実行される順序付けられた動作のセットの仕様は、上述のように、スクリプトの形態で受信されうる(例えば、ステップエディタユーザインターフェースを用いてユーザ入力に基づいて生成されたスクリプト、ファイルからインポートされたスクリプト、など)。
工程504で、データセットは、データセットの少なくとも1つの次元に依存するコスト関数に基づいて、複数の作業部分に分割される。いくつかの実施形態において、データセットは、作業部分に含める行の数を考慮するコスト関数に基づいて分割される。コスト関数は、処理されるデータの量、さらなる作業部分/パーティションを作成する計算コスト、行をパーティション/作業部分に追加するコスト、実行される動作の計算コストなど、様々な要素を考慮に入れることができる。データセットを複数の作業部分/パーティションに分割するための技術および戦略の例については、上述している。複数のデータセットが仕様内で指定されている場合、それらのデータセットは、独自のそれぞれのネームスペース内の論理パーティションに分割されうる。
工程506で、複数の作業部分は、動作の仕様に従って処理されるように、複数の処理ノードに分散される。例えば、スケジューラ(例えば、Sparkスケジューラ)が、決定された作業部分を分散型コンピュータクラスタ内の処理ノードに分散させる。いくつかの実施形態において、決定された作業部分は、或る入力データに実行される依存動作のツリー構造の記述を用いて処理ノードに送信される。依存動作の一例は以下の通りである。列A、B、および、Cのキャッシュに依存する列Bへの変更に依存する列Aへの変更を行う。
分散型パイプライン最適化のための上述の戦略および技術は、様々な利点を提供する。例えば、上述のように、データセットは、データ自体の特性(例えば、行内のデータ量、行内のアクティブな列など)を考慮に入れるインテリジェントな方法で、ワーカに分散されうる。これは、ワーカが、例えば、同等の量のデータを処理することを可能にして、遅延したワーカ(例えば、自身の作業部分を計算するのにより長い時間が掛かっているワーカ)を待つのに必要な時間を削減する。別の例として、クラスタの物理特性を考慮することにより、クラスタのリソースを効率的に利用する作業部分を生成できる。別の例として、上述の戦略を用いれば、さらなるオーバーヘッドを最小化し、並列性を最大化するように、作業部分の最適数および/または作業部分に含めるデータの行数/量を決定することができる。したがって、分散型計算が、より効率的かつ予想通りに実行されうる。
データ変換およびキャッシュ最適化
入力データセットが分割および分散されると、順序付けられたデータ準備動作のセットが、受信されたスクリプトの仕様に従ってデータセットに適用されうる。例えば、1または複数の入力データセットを分割して、分散型コンピュータクラスタ内のワーカ/ノードにそれらを分散させた、パイプラインマスタ308は、パイプラインエグゼキュータと協調して、変換結果を決定するよう構成される。いくつかの実施形態において、パーティション/作業部分に作用する各パイプラインエグゼキュータは、順序付けられた動作のセットを実行した全体結果の一部を提供するよう構成される。パイプラインマスタは、結果の部分を全体結果に並べる/結合する責任を有する。いくつかの実施形態において、クラスタのパイプラインマスタは、図2のデータ変換エンジン210およびキャッシュエンジン212を実装するために用いられる。
一部の例では、Sparkなどの分散型コンピュータプラットフォームが、様々な動作を実行するためのネイティブ機能を備えている。しかしながら、これらのプラットフォームが動作を実行する方法は、通例、データが複製されることを必要とし、これは、リソース集約的かつ非効率でありうる。
本明細書に記載の技術を用いると、パイプラインの各ステージでデータを複製することなしに、順序付けられた動作のセットを実行することが可能であり、それにより、順序付けられた動作のセットを実行して、データ変換結果を取得する速度および効率を高めることができる。Sparkなどのプラットフォームが、本明細書に記載の技術と対照的に、動作の実行時にデータをどのように複製するのかを示す一例が、図10A〜10Fを参照して後述するソート動作に関して示される。
後に詳述するように、データがパイプラインを通して処理される時に、列ファイルおよびデータトラバーサルプログラムを含むデータフラグメントが生成されうる。データフラグメントは、パイプラインの様々なステージでの累積結果(例えば、順序付けられたデータ準備動作の一部を実行した結果)を表すために用いられる。変換結果を表すフラグメントは、再利用に向けてパイプラインの様々なステージにキャッシュされうる。例えば、処理を受けた所与の作業について、パイプラインの特定のステージまでのその作業に対する動作の累積結果(または結果の表現)が、ディスクに保存されるかまたはキャッシュ層に格納されうる。キャッシュされた表現は、動作のセットにおける特定のステージでのデータの状態を再構築するために後に利用されうる。データフラグメント/表現は、パイプラインの終わりだけでなく、中間でもキャッシュされうる。これは、パイプラインの様々なステージでの中間結果を見ることを可能にする。さらに、(例えば、図2のユーザインターフェースエンジン202によって提供されたエディタインターフェースを用いる)スクリプト内に定義された順序付けられたデータ準備動作のセットの編集が、キャッシュされた結果につながる順序付けられたステップのセットの再計算を実行する必要なしに、同じキャッシュされた結果を再利用できる。例えば、いくつかの実施形態において、キャッシュされた表現は、キャッシュされた表現によって表された結果につながる順序付けられた動作のセットの記述(例えば、文字列記述)の関数(例えば、SHAハッシュ関数などのハッシュ関数)であるシグネチャを用いて識別される。新しいデータ準備スクリプトが受信されると(例えば、ユーザがエディタインターフェースを介してデータ準備を構成すると)、シグネチャが、新しいスクリプトの動作から生成され、利用できる既存のキャッシュされた表現があるか否かを判定するために利用されうる。
いくつかの実施形態において、本明細書に記載のキャッシュされた表現は、列の作業負荷に対して最適化される。列の作業負荷は、列データ変換を実行するために用いられるデータ準備動作を含む。いくつかの実施形態において、キャッシュされた表現を生成するために用いられるデータフォーマットおよび構造は、例えば、必要最小限のデータが可能な限り迅速に処理されるようにパイプラインサーバを通るデータの流れを制限するために、速度および効率に対しても最適化される。
列の作業負荷を最適化されたキャッシュの(再)利用について、データトラバーサルプログラムの生成および再利用を含め、データ準備動作の様々な例を参照しつつ以下で説明する。いくつかのデータ準備動作の詳細の例が、例示目的で提供されるが、そのリストは、包括的ではなく、本明細書に記載の技術は、必要に応じて任意の他のデータ準備動作に合わせて適切に適合されうる。
データ準備動作の例
ユーザが、(例えば、図2のフロントエンド200のユーザインターフェースエンジン202によって提供された)ユーザインターフェースを介して、データセットと、データセットに実行すべき順序付けられたデータ準備動作のセットとを指定し、結果として、図6Aに示したスクリプトが、(例えば、図2のスクリプトジェネレータ204を用いて)生成されたと仮定する。スクリプトは、Apache Sparkなどの分散型コンピュータプラットフォームを用いて実装されたパイプラインサーバ(例えば、図2のフロントエンド200から図3のパイプラインサーバ300)によって受信される。
図6Aは、スクリプトの実施形態の一例を示す。図に示すように、スクリプト600は、602で処理を受ける(そして、インポートされる)データセット(この例では、「DS1」と呼ぶ)の記述である。処理されるデータセットのコンテンツは、図6Bで示される。スクリプトは、さらに、データセットに実行すべき順序付けられた動作のセットを含む。この例において、順序付けられた動作のセットは、データセットの列Aへの大文字化動作(604)と、値「e」および「h」に関するデータセットの列Bへのフィルタ動作(606)と、を含む。順序付けられた動作のセットは、データセットが処理されるパイプラインを形成する。この例において、動作の論理的順序は、物理的実行順序でもあるが、そうである必要はない(例えば、物理的実行順序は、例えば、スマート最適化コンパイラの存在下では異なってもよい)。例えば、データ準備動作の順序は、その順に、連続した位置に2つの動作「f」および「g」を含む。スマートコンパイラは、「f」の前に「g」を実行することが正確に同じ結果を生み出しつつ、計算が速くなると判定しうる。例えば、スクリプト600で指定された動作例において、最終結果は、大文字化ステップおよびフィルタステップを交換しても得られうる。そうすることにより、大文字化動作を実行される行がさらに少なくなり、計算の速度(および効率)が上がる。
この例に示すように、データ準備動作は、列の性質を持ち、ここで、データセットに実行される動作は、特定の列に関して定義される。例えば、大文字化動作は、データセットの列「A」に実行され、フィルタ動作は、特定の列(列「B」)に見られる特定の値に基づいて実行される。かかるデータ準備動作について、データセット全体が変換される方法は、特定の列が動作によって影響される方法、または、動作において関係する特定の列の特性に基づいている。これは、後に詳述するように、データ準備動作のパフォーマンスの最適化および効率化のための技術を提供するために利用される。
608で、スクリプトは、データ準備動作の結果がどのように出力されるのかを示す。この例において、結果は、表示される(例えば、図2のユーザインターフェースエンジン202によって提供されたユーザインターフェースでユーザに提示される)。結果を出力するオプションの別の例は、結果を発行すること(例えば、別のファイルに結果をエクスポートすること)である。
図6Bは、処理されるデータセットの実施形態の一例を示す。この例において、データセット650は、図6Aのスクリプト600の602で指定されたデータセットに対応する。
スクリプト600で定義された順序付けられた動作のセットによって形成されるパイプラインの各ステージで実行される処理について、以下に詳述する。例示の目的で、順序付けられた動作内の各ステップで書き込まれたファイルは、保存(キャッシュ)されるが、必ずしもその必要はない。
インポート/スタート
スクリプト600の第1動作は、インポート/スタートである。行が分割および分散される方法に関する決定が(例えば、図2のデータ分割エンジン208によって)なされた後、様々なパーティションに割り当てられたデータがインポートされる。いくつかの実施形態において、データのインポートは、順番に高速でデータへアクセスすること(例えば、上から下まで高速でデータの列を読み出すこと)ができるようにデータを準備することを含む。
図7Aは、インポート動作中に生成されたデータ構造の実施形態の一例を示す。いくつかの実施形態において、図7Aの例は、図6Bの例から続く。いくつかの実施形態において、図7Aでインポートされるデータは、図6Bのデータセット650(DS1)からのデータである。
この例では、DS1が2つの論理パーティション(すなわち、パーティション0(702)およびパーティション1(704))に分割されていると仮定する。それらのパーティションは各々、1または複数のワーカ(例えば、上述したSparkワーカ/パイプラインエグゼキュータ)によって処理される。上述のように、各パーティションは、DS1の行の一部を含み、2つのパーティションは、集合的に、データセット全体を含む。パーティションの間で、行の一部は、重複せず、隣接している。
作業(データ)が分割されており、DS1の各行は、座標のセットによって一意的に識別される。いくつかの実施形態において、座標は、その行が見つかりうるパーティションと、パーティション内のその行の識別子と、を示す。本明細書に記載の例において、座標は、以下のように構造化される:(パーティション番号,行識別子)。一意的な行識別子の一例が、参照テーブル706および708に示されており、それぞれ、パーティション0および1に対応する。
図に示すように、データセットDS1は、2つのパーティションに均等に分割されており、データセットの上3行がパーティション0に割り当てられ、下3行がパーティション1に割り当てられている。
この例において、各パーティションは、列に対応するファイルのセット(710および712で示す)にデータを格納する。例えば、710では、データセットDS1の列「A」、「B」、および、「C」にそれぞれ対応する別個の列ファイルが書き込まれる(例えば、データセットDS1のコンテンツは、(スクリプト内で指定された)それらのソースから取得され、列ファイルに再書き込みされる)。別個の各列は、パーティション内にあるDS1の行すべてに対するセルを順に記述する。いくつかの実施形態において、書き込まれる列値は、(スクリプト内で指定された)入力データセットのソースから読み出され、元々のソースデータセットは修正されない(例えば、ソースデータセットの値は、列ファイルにコピーされる)。
列ファイル710および712には、それぞれ、ルックアップテーブル714および716が伴う。ルックアップテーブルの各行は、行識別子(「Row_ID」)を含んでおり、(識別された行のデータ値の位置を示す)列ファイルにインデックス化される。この例において、インデックス列に示されたインデックスは、それぞれの列ファイルへのバイトインデックスである。
ルックアップテーブルおよび列ファイルの構造は、例えば、データすべてが高速で列から読み出されうるように、順次アクセスについて最適化される。図に示した構造は、効率的な非順次の行プローブ(例えば、行のランダムアクセスプロービング)も可能にする。例えば、或る列の或る行における特定の値にアクセスするために、テーブルのルックアップが、対象の行および対象の列の行識別子を用いて実行されうる。その(行,列)座標に対応するインデックス値が、ルックアップテーブルから取得され、対応する列ファイルにアクセスするために用いられる。次いで、列ファイルのインデックスにおける値が、ロードおよび読み出しされる対象でないその他のデータを必要とせずに、直接リトリーブされうる。
この例において、列ファイル内の値は、順に格納され、バイト順にインデックス付けされる。それらの値は、異なるタイプ(例えば、文字型、整数型など)でありえ、異なるサイズ(例えば、バイト)でありうるので、ルックアップテーブル内のインデックスは、ファイル内でのその開始バイト位置によって列ファイル内のセルの位置を示す。例示の目的で、本明細書に記載のこの例およびその他の例の全体で、文字は1バイトのサイズを有すると仮定する。本明細書に記載の例に示された数値についても、例示の目的で、2バイトのサイズの整数であるとする。
インポート動作の一部として、パーティション1によって書き込まれた列「C」に対応する列ファイル(718)を例に取る。列ファイルは、値「cats」、「n」、および、「q」を含む。列ファイルのための対応するバイトインデックスは、ルックアップテーブル716の720に示されている。値「cats」に対する「C_file」内の開始バイトは、列ファイルに書き込まれた初期データ値であるため、0である。値「n」に対する「C_file」内の開始バイトは、4である。これは、4文字を含む単語である値「cats」が4バイトのサイズを有するからである。したがって、列ファイル718内のゼロ番目のバイトは、(パーティション1内の)「C」列ファイルの第1行の値を含み、4番目のバイトは第2行を開始し、5番目のバイトは列の第3行を開始する。したがって、データは、バイトインデックスによって列ファイルから読み出すことができる。
バイト(または、サイズの任意の他の適切なデータ単位)インデックスを用いることにより、列の値は、値の間のスペース/ギャップなしに、列ファイルに緊密にパッキングされうる。これは、列の値の空間効率のよい格納と、それらの値の効果的なルックアップとを可能にする。列ファイルは、個別かつコンパクトに格納されるので、動作が特定の列全体に対する動作を必要とする場合に、(例えば、インデックス化なしに)直接的に、対象ではない任意の他の列から値を読み出すことなしに、対応する列ファイルを読み出すことができる。したがって、図に示したデータ構造/フォーマットは、空間効率がよく、列状で、特定の列動作に最適化されている。上述のように、図のデータフォーマットは、ランダムアクセスおよび順次アクセスの両方に最適化されている。
いくつかの実施形態において、列ファイルおよび対応するルックアップテーブルのセットは、一緒にファイルセットに含められる。この例において、ルックアップテーブル714および列ファイル710は、ファイルセット722に含まれる。ルックアップテーブル716および列ファイル712は、ファイルセット724に含まれる。各ファイルセットは、ファイル名/キャッシュ識別子と関連付けられており、ファイル名/キャッシュ識別子は、実際の列の値を含むファイルセットをロケートするために利用されうる。この例において、ファイルセット名/識別子は、列ファイルの書き込みをもたらしたステップの名前と、ファイルを書き込んだパーティションとに基づいて生成される。例えば、パーティション0によって書き込まれたファイルセット722は、「import_ds1_p0」と呼ばれ、ds1をインポートするステップ(「import_ds1」)の間にファイルセットがパーティション0(「p0」)によって書き込まれたことを示す。同様に、パーティション1によって書き込まれたファイルセット724は、「import_ds1_p1」と呼ばれ、ds1をインポートするステップ(「import_ds1」)の間にファイルセットがパーティション1(「p1」)によって書き込まれたことを示す。パーティションすべてにわたって実行される動作のためのファイルセットを生成する場合、生成されるハンドル/キャッシュIDは、全パーティションにわたって一致する。この例で、インポートDS1動作に関わるパーティション0および1について、パーティションによって書き込まれたファイルセットのハンドル(「import_ds1」)は、両方のパーティションにわたって一致しており、違いは、ファイルセット名の最後に連結されるパーティション番号である。いくつかの実施形態において、ファイルセットは、キャッシュ/ストレージに書き込まれ、上述の識別子を用いて取得できる。かかるキャッシュ識別子/ファイルセット名の利用については、後に詳述する。
図に示すように、データセットが、複数のパーティションに分割されえたが、指定された順序付けられた動作のセットは、パーティション間での情報の移動を必要としない(すなわち、行はパーティション間を移動しない)ので、スクリプト600の残りのステップについては、1パーティションのみに関して実行される処理が示されている。入力データセットが分割された他の論理パーティションで、同様の処理が実行される。パーティション間の行の移動をもたらす動作の例については、後に詳述する。
書き込まれるファイルセットに加えて、各パーティションは、本明細書で「データトラバーサルプログラム」(DTP)と呼ばれるものに関連付けられる。データトラバーサルプログラムは、参照テーブルおよび参照スタックを含んでおり、それらは共に、パイプラインの特定のステージ時点でのデータの一部の状態を読み出す方法(例えば、入力データセットに対して順序付けられた動作のセットのある部分を実行した累積結果であるものを読み出す方法)についての情報を提供する。参照テーブルは、順序付けられた動作のセット中の行変換の参照を含み、参照スタックは、順序付けられた動作の記録と、順序付けられた動作によって変更された列とを含む。いくつかの実施形態において、順序付けられた動作のセット中の各動作が実行されると、パーティションのためのデータトラバーサルプログラムの参照テーブルおよび参照スタックは、所与の動作まで順序付けられた動作のセットを実行した後に、累積変換結果を反映するように更新される。いくつかの実施形態において、データトラバーサルプログラムは、キャッシュ層に格納される。これは、データトラバーサルプログラムが、動作の実行時に高速でアクセスおよび更新されることを可能にし、それにより、動作を繰り返す必要なしに、(中間結果を含む)動作の結果への効率的なアクセスを可能にする。
いくつかの実施形態において、パーティションのデータトラバーサルプログラムは、実行時、パーティションの参照テーブルおよび参照スタックを用いて、入力データセットに実行された順序付けられた動作のセットに起因するデータセットのサブセットである順序付けられた行のセットを取得する。結果として得られたデータセット全体における順序付けられた行のサブセットの位置は、パーティションの順序内の対応するパーティションの位置に基づく。例えば、パーティション「N」のためのデータトラバーサルプログラムから取得された順序付けられた行のサブセットのすぐ後に、パーティション「N+1」のためのデータトラバーサルプログラムから取得された順序付けられた行のサブセットが続く。様々なパーティションからの順序付けられた行のサブセットは、重複しない。順序付けられた行のサブセットは、この順に読み出されると、1または複数の入力データセットに実行された順序付けられたデータ準備動作のセットの結果を集合的に形成する。
いくつかの実施形態において、データトラバーサルプログラムの参照テーブルおよび参照スタックは、パイプライン内の所与の時点まで順序付けられた動作のセットを実行した累積結果を反映するように、各データ準備動作が実行されるにつれて更新される。パイプラインは、例えば、ユーザが見直したいと思いうる様々なステージおよび中間結果を含むので、いくつかの実施形態においては、データトラバーサルプログラムのコピーが、保存ポイントで(例えば、データ準備動作の順序における次のステップによって更新される前に)キャッシュされうる。キャッシングは、例えば、データがパイプライン/順序付けられた動作のセットの様々な時点を通して進むにつれて変化するデータの漸進的な保存を可能にする。
図7Aの例に示すように、パーティション0および1の各々は、それぞれ、独自のデータトラバーサルプログラム726および728と関連付けられている。パーティション0に関連するデータトラバーサルプログラム726は、参照テーブル706および参照スタック730を備える。パーティション1に関連するデータトラバーサルプログラム728は、参照テーブル708および参照スタック732を備える。いくつかの実施形態において、データトラバーサルプログラム(対応する参照テーブルおよび参照スタックを含む)は、インポートの実行の結果として初期化(作成)される。後に詳述するように、いくつかの実施形態において、データトラバーサルプログラムは、順序付けられたデータ準備動作のセットの結果を表し、結果を引き出すために1または複数の影響を受けた列をどのように集めるのかを示す。
ここで、パーティション0の参照スタック730について記載する。この例において、(現在、インポートステップ後の1行だけを含む)参照スタック730の第1行は、キャッシュ識別子(「cache id」)734を含む。キャッシュ識別子は、736で示す行内の対応するエントリで示すように、列「A」、「B」、および、「C」を提示する。キャッシュid734は、パーティション(パーティション0)のインジケータと併せると、ファイルセット722に対応するファイル名(「import_ds1_p0」)になる。これは、パーティション0によるインポートのために書き込まれたデータの位置を示す。参照スタックは、実行されたインポート動作から結果として得られたデータセット全体の一部である順序付けられた行のセットを読み出すために、対応する参照テーブルと併せて用いられる。
DS1のインポートの結果を読み出す一例は、以下の通りである。例えば、ユーザが、処理後のデータセットDS1の状態を知りたいと仮定する(これは、インポートがデータセットへの修正を行わないことから、同じに見えるはずである)。図7Aに示したファイルおよびデータトラバーサルプログラムは、(例えば、閲覧に向けて)インポートステップ時点のDS1を集めるために、以下のように利用できる。
インポートされたデータを適切な順で読み出すために、パーティションのデータトラバーサルプログラムは、それらが対応するパーティションの順に実行される。したがって、パーティション0のデータトラバーサルプログラム726が最初に実行される(パーティションのデータトラバーサルプログラムは、並列で実行されてもよく、各データトラバーサルプログラムからの部分結果は、それらが取得された時の正確な順番で配置される)。
データトラバーサルプログラム726は、以下のように実行される。参照テーブル706は、3つの行を含む。これは、(パーティション0に関連する)データトラバーサルプログラムが、実行時に、インポートされたデータセットの最初の3行を提供することを示す。インポートされたデータセットの第1行は、以下のように取得される。参照テーブル706の第1行(738)内の第1(かつ、今のところ唯一の)列の値、すなわち、座標(0,0)が取得される。参照テーブルのこの列は、参照スタック内の第1(かつ、今のところ唯一の)行に対応する。その行は、キャッシュ識別子734を含み、736で列「A」、「B」、および、「C」を識別する。
取得された座標(ゼロ)からのパーティション番号が、キャッシュid734に付け足されることで、ファイル名「import_ds1_p0」が得られ、これは、同じ名前のファイルセット722に対応する。次いで、ファイルセット722が、アクセスされる。次いで、取得された座標(ゼロ)の行識別子が取得される。取得された行識別子は、ファイルセット722のルックアップテーブル714のルックアップを実行するために、736で識別された列「A」、「B」、および、「C」と併せて用いられる。列「A」、「B」、および、「C」が識別されると、取得された行番号「ゼロ」が、ルックアップテーブルを用いて、それらの列のゼロ番目の行における値をルックアップするために用いられる。ルックアップテーブルのインデックス列のゼロ番目の行内の対応するバイトインデックスが取得され、列ファイル710にアクセスするために用いられる。したがって、列「A」、「B」、および、「C」に対する値「a」、「b」、および、「c」を含む行は、対応する列ファイル710から取得される。
インポートされたds1データセットの第1行に到達するためにデータ実行プログラムによって実行される処理については、図7Bを参照しつつ再び記載する。
図7Bは、データトラバーサルプログラムを実行する実施形態の一例を示す。図7Bの例において、記載される様々な参照テーブル、参照スタック、および、ファイルセットは、図7Aにおけるそれぞれの同等物に対応する。
パーティション0のためのデータトラバーサルプログラム(例えば、図7Aのデータトラバーサルプログラム728)が実行される。データトラバーサルプログラムは、(図7Aの参照テーブル706に対応する)参照テーブル750の1番目の行(752)を読み出すことによって開始する。この行内の単一のエントリは、座標(0,0)を含んでおり、これは、パーティション0、行id0を示す参照である。
このように、行752は、単一の列を含んでおり、その列は、参照スタック754における唯一の行すなわち行756にマッピングされる/対応する。この例において、 参照スタック754は、図7Aの参照スタックに730に対応する。行756は、2つのエントリを含んでおり、1つは、キャッシュ識別子のためのエントリである。以下に示すように、キャッシュ識別子は、ファイルセットをロケートするために行752から取得された座標内で識別されたパーティション番号と組み合わせられる。行756内の2番目のエントリは、ロケートされたファイルセットを用いて値が取得される列の示唆を含む。
行752から取得された座標は、758に示されており、図に示すように、パーティション番号(0)および行識別子(0)を示す。参照スタック754の行756から取得されたエントリは、760に示されている。758および760に示された取得済みの値は、以下のように一緒に用いられる。
参照758から抽出されたパーティション番号「0」は、760から抽出されたキャッシュid「import_ds1」値と組み合わせられ、ファイル名「import_ds1_p0」(762)を生成する。組みあわせは、例えば、文字列の連結、組み合わされた値のハッシュの生成、または、任意の他の適切な組みあわせ関数によって実行される。これは、同じ名前のファイルセット(図7Aのファイルセット722)をロケートしてアクセスするために用いられ、そのファイルセットは、図7Aに関して上述したように、インポートステップの結果として書き込まれたものである。
次いで、参照758から抽出された行識別子「0」は、ファイルセット722のルックアップテーブル766のルックアップを実行するために用いられる。抽出された行識別子「0」に基づいて、ルックアップテーブル766の行768が識別されアクセスされる。
参照スタック行760で指定された列タイトル770〜774(それぞれ「A」、「B」、および、「C」)に基づいて、行768に対応するそれらの指定された列タイトルの値が、ルックアプされ取得される。これは、以下のように実行される。列「A」、「B」、および、「C」が指定されているので、行768内の対応する列のインデックス値が、ルックアップテーブル766から取得される。次いで、それらのインデックスは、ファイルセット内のそれぞれ対応する列ファイルに書き込まれた実際のデータ値をルックアップするために用いられる。この例において、指定された列タイトル「A」、「B」、および、「C」の対応する値は、「a」、「b」、および、「c」である。したがって、インポートされたds1の1番目の行が、読み出された/取得された。
次いで、インポートされたds1の次の2行が、参照テーブル内の下のエントリに移動して、上述したのと同じ処理を実行することによって読み出される。例え例えば、(参照座標(0,1)を備えた)参照テーブル750の2番目の行のエントリは、ファイルセット722から値「d」、「e」、および、「f」を取得するために上述のデータトラバーサルプログラム処理を用いて、(参照テーブルの1番目の唯一の列と参照スタックの1番目の唯一の行とのマッピングに基づいて)参照スタック754の1番目の行と組み合わせられる。(値「g」、「h」、および、「i」を含む)インポートされたDS1の3番目の最終行も、パーティション0のデータトラバーサルプログラムを用いて同様に取得できる。
次いで、パーティション1のデータトラバーサルプログラム728も、上述のように同様に実行され、DS1の下の3行が順に取得される。
次いで、順序付けられた行の2つの取得されたサブセットは、組み合わせられ、出力として提供される。例えば、ユーザが、ユーザインターフェースで結果を見たい場合、順序付けられた行のサブセットは、対応するパーティション順に表示される(すなわち、パーティション1のデータトラバーサルプログラムを用いて取得された順序付けられた行のサブセットが、パーティション0のデータトラバーサルプログラムを用いて取得された順序付けられた行のサブセットの下に表示される)。ユーザが、結果を発行したいと示唆する場合、順序付けられた行のサブセットは、対応するパーティション順に基づいて互いに付加される(すなわち、パーティション1のデータトラバーサルプログラムを用いて取得された順序付けられた行のサブセットが、パーティション0のデータトラバーサルプログラムを用いて取得された順序付けられた行のサブセットの下に付加される)。
いくつかの実施形態において、データトラバーサルプログラムの実行は、各パーティションに対して並列で実行される。データトラバーサルプログラムから結果として得られた順序付けられた行のサブセットは、それらが取得されたパーティションの順に配置される。
インポートステージの時点で書き込まれた(インポート動作の結果を表す)データトラバーサルプログラムが保存されうる。キャッシュされたデータトラバーサルプログラムは、例えば、参照および参照テーブルを再生成する必要を避けるために、後に利用できる。
上記の例において、参照テーブルは、1列のみを含み、参照スタックは、1行のみを含む。複数列を備えた参照テーブルおよび/または複数行を備えた参照スタックを含むさらなる例については、後に詳述する。
スクリプト600の例に続いて、ここで、大文字化動作およびフィルタ動作の実行に関連する処理の例について記載する。大文字化動作およびフィルタ動作は、パーティション間の行の移動をもたらさないため、互いに独立してパーティションによって実行されうるので、パーティション0で起きる処理を以下に示す。同様の処理が、パーティション1で実行される。
大文字化
データをインポートした後、スクリプト600のパイプラインにおける次のステップは、列Aの値に大文字化を実行することである。ここで、その動作は、特定の列(列A)に対して実行される。図8Aは、更新されたデータトラバーサルプログラム(810)と、列Aに対する大文字化動作を実行する一環として生成されたファイルセット(806)との実施形態の一例を示す。
この例において、列Aに対する大文字化動作は、以下のように実行される。大文字化動作の実行前、パーティション0のデータトラバーサルプログラムの状態は、図7Aの例に示した状態である。
列Aの現在の値は、例えば、データトラバーサルプログラムの現在の状態を用いて列Aの読み出しを実行することによって取得される。大文字化動作は、取得された列値に対して実行される。現在、列Aの値は、動作の結果と異なるので、列Aの新しい大文字バージョンのための新しい列ファイルが、802に示すように書き込まれる(そのファイルは、大文字値を含む)。対応するルックアップテーブル804も、新しいバージョンの列Aの値をルックアップできるように書き込まれる。新しい列ファイル802および対応するルックアップテーブル804は、ファイルセット806に含まれており、ファイルセット806は、この例では、808に示すように「Up_A_Import_ds1_p0」という名前を与えられる。この例において、ファイルセット名は、書き込まれたファイルセット内の列ファイルをこれまでにもたらした実行済みの動作を(例えば、文字列連結、ハッシュ関数などを用いて)組み合わせることによって生成される。ファイルセットを書き込んだパーティション番号も、名前に追加される。例えば、808の名前「up_A_Import_ds1_p0」は、DS1のインポート後に実行された列Aに対する大文字化動作の実行時にファイルセット806がパーティション0によって書き込まれたことを反映するように生成されたものである。
このように、列Aだけが動作中に指定され、列Aの値だけが修正された(すなわち、列Aがこの動作で唯一のアクティブな列である)ので、列Aの新しいバージョンのためのファイルセットのみが、パイプラインのこのステージで作成される必要がある。したがって、大文字化動作によって触れられなかったデータセットDS1内のその他の列に対しては、新しいデータを生成/書き込む必要はない。したがって、データ準備動作の実行時に変化するデータが、漸進的に書き込まれうる。
新しい列ファイルが大文字化ステップの結果として書き込まれたことで、パーティション0のデータトラバーサルプログラムは、それに従って(例えば、インポートステップ時点の状態から)更新/修正される。大文字化ステップ時点のデータトラバーサルプログラムの新しい状態は、810に示されている。
新しいデータトラバーサルプログラムは、以下のように生成される。パーティション0が関与する現在のデータトラバーサルプログラムが取得される(インポートステップ時点の図7Aのデータトラバーサルプログラム726)。新しい行812が、既存の参照スタックの上に追加され(「置かれ」)、パーティション0の新しい参照スタック814を生成する。新しい行812は、以下を示す:(1)(パーティション番号なしの)新たに書き込まれたファイルセット806のキャッシュ識別子/ハンドル部分;および、(2)書き込まれた列のタイトル(「A])。この例では、列Aの新しいバージョンが書き込まれている。この新しいバージョンの列Aは、インポートステップの一環として書き込まれた列Aファイルの以前のバージョンに取って代わる。これを表すために、行816の「A」値は、下線で示すように、データトラバーサルプログラムには利用不可能であるとマークされている。データを読み出す時、新しい列Aファイルから値が読み出され、(図7Bのファイルセット722に見られる)列Aファイルの以前のバージョンは、アクセスおよび読み出しされない。これは、データトラバーサルプログラムが、最新バージョンの列のみの読み出しを強制することを可能にする。
新しい列816が、(列818のみを含んだ)既存の参照テーブルの左へさらに追加され、パーティション0のための新しい参照テーブル820が生成される。この例において、インポートされたデータセットの行は、位置を変えておらず、新しい列816に含まれる参照内の座標の各々は、まだ、列818に示したのと同じ位置および行識別子を特定する。
参照テーブル内の列(左から右)は、参照テーブル内の対応するそれぞれの行(上から下)にマッピングされる。例えば、参照テーブル820の列816は、参照スタック814の行812にマッピングされる。参照テーブル820の列818は、参照スタック814の行816にマッピングされる。このマッピングは、特定のパイプラインステージの時点のデータトラバーサルプログラムが、特定のパイプラインステージの時点のデータセットの行を集めるために、以前に書き込まれたファイルセットから値をどのように読み出すのかを知らせる。任意のその他の適切なマッピングが実行されてもよい。
したがって、インポートステップからのデータトラバーサルプログラムは、ds1のインポート後に大文字化を列Aに実行した新しい結果を反映するために、更新/修正される。データトラバーサルプログラム810は、ds1がインポートされた後に列Aが大文字化されたパイプライン内のステージでの結果の表現を格納するためにキャッシュされうる。いくつかの実施形態では、データトラバーサルプログラムに対応するシグネチャが生成される。シグネチャは、(例えば、動作の表現(例えば、文字列表現)を一緒にハッシュすることによって、動作を連結することによって、または、任意のその他の組みあわせ関数によって)キャッシュされるデータトラバーサルプログラムによって表された結果につながった動作に基づいて生成されうる。次いで、データトラバーサルプログラム810のコピーが、それに対応するシグネチャと共にキャッシュされる。その後、キャッシュされたデータトラバーサルプログラムは、後に詳述するように、それに対応するシグネチャによって後で識別されうる。
DS1のインポート後に大文字化を列Aに実行した後に結果の一部を取得するために、更新されたデータトラバーサルプログラム810を実行する一例について、図8Bを参照して説明する。
図8Bは、データトラバーサルプログラムを実行する実施形態の一例を示す。図の例では、データセットDS1をインポートした後に大文字化を列Aに実行した結果としてのデータセットの1番目の行が読み出される。その行は、(例えば、ユーザインターフェースで見るため、発行/エクスポートのため、など)インポート動作およびその後の大文字化動作の結果が出力される時に、読み出されうる。図8Bの例において、様々な参照テーブル、参照スタック、および、ファイルセットは、図8Aにおけるそれぞれの同等物に対応する。
この例では、パーティション0のためのデータトラバーサルプログラム(例えば、図8Aのデータトラバーサルプログラム810)が実行される。データトラバーサルプログラムは、(図8Aの参照テーブル820に対応する)参照テーブル850の1番目の行852を読み出すことによって開始する。その行は、2つのエントリ、すなわち、列854内の参照/座標(0,0)および列856内の参照/座標(0,0)、を含む。上述のように、参照テーブル850の最左列(854)は、(図8Aの参照スタック814に対応する)参照スタック858の最上行(860)にマッピングされる/対応する。参照テーブル850の最右列(856)は、参照スタック858の最下行862にマッピングされる。
参照テーブル850の行852および列854における参照(0,0)と、参照スタック858の行860におけるエントリとのペアリングが、864に示されている。参照テーブル850の行852および列856における参照(0,0)と、参照スタック858の行862におけるエントリとのペアリングが、866に示されている。
ペアリング864を用いてデータトラバーサルプログラムによって実行される処理について、最初に説明する(864および866の処理は、任意の順に、並列で、または、任意のその他の適切な方法で実行されてよい)。参照テーブル850の行852および列854から取得された座標は、868に示されており、図に示すように、パーティション番号(0)および行識別子(0)を示す。参照スタック858の行860から取得されたエントリは、870に示されている。868および870に示された取得済みの値は、以下のように一緒に用いられる。
参照868から抽出されたパーティション番号「0」は、870から抽出されたキャッシュ識別子「Up_A_Import_ds1」値と組み合わせられ、ファイル名「Up_A_Import_ds1_p0」(872)を生成する。その組みあわせは、同じ名前のファイルセット(ファイルセット874)をロケートしてアクセスするために用いられ、そのファイルセットは、図8Aに関して上述したように、インポートされたDS1に対して列Aへの大文字化動作が実行された結果として書き込まれたものである。この例において、ファイルセット874は、図8Aのファイルセットに806に対応する。
次いで、参照868から抽出された行識別子「0」は、ファイルセット874のルックアップテーブル876のルックアップを実行するために用いられる。抽出された行識別子「0」に基づいて、ルックアップテーブル876の行878が識別されアクセスされる。
参照スタック行870で指定された列タイトル880(「A」)に基づいて、行878に対応する指定された列タイトルの値が取得される。その値は、ルックアップテーブルの行878内の列Aのインデックス値をルックアップすることによって取得される。これは、バイトインデックス「0」を提供する。列Aのためのファイル(A_file)のゼロ番目のバイトインデックスでの値が取得される。これは、値「A」である。これは、大文字化ステップの前の値(「a」)の大文字バージョンである。したがって、インポートされたデータセットDS1の列Aに対する大文字化の結果として得られたデータセットの1番目の行の列Aの値が取得される。
次いで、データトラバーサルプログラムは、ペアリング866を用いて、列BおよびCの残りの値を取得するよう構成されている。列Aの(ds1のインポート後にAに大文字化した後のパイプラインのステージの時点での)現在の値がファイルセット「Up_A_Import_ds1_p0」から取得された上述の処理と対照的に、列BおよびCの現在の値は、別のファイルセットから取得される。この例において、列BおよびCの値は、インポートステップ中に書き込まれたファイルセット(「Import_ds1_p0」)を用いて取得される。これは、列BおよびCが列Aへの大文字化動作によって変更されておらず、したがって、以前のステージで書き込まれたそれらの値がパイプラインのこのステージでも有効である(まだ最新のバージョンである)ことを、部分的に反映している。
ペアリング866は、以下のように、データトラバーサルプログラムによって用いられる。参照テーブル850の行852および列856から取得された座標は、882に示されており、図に示すように、パーティション番号(0)および行識別子(0)を示す。参照スタックの行862から取得されたエントリは、884に示されている。882および884に示された取得済みの値は、以下のように一緒に用いられる。
参照882から抽出されたパーティション番号「0」は、884から抽出されたキャッシュid「import_ds1」値と組み合わせられ、ファイル名「import_ds1_p0」(886)を生成する。組みあわせは、例えば、文字列の連結、組み合わされた値のハッシュの生成、または、任意の他の適切な組みあわせ関数によって実行される。これは、同じ名前のファイルセット(ファイルセット888)をロケートしてアクセスするために用いられ、そのファイルセットは、図7Aに関して上述したように、インポートステップの結果として以前に書き込まれたものである。この例において、ファイルセット888は、図7Aのファイルセットに722に対応する。
参照スタック行884で指定された列タイトル890および892(それぞれ「B」および「C」)に基づいて、行894に対応するそれらの指定された列タイトルの値が、ファイルセット888内でルックアプされ取得される。これは、以下のように実行される。列「B」および「C」が指定されているので、行894内の対応する列のバイトインデックス値が取得される。次いで、それらのインデックスは、ファイルセット内のそれぞれ対応する列ファイルに書き込まれた実際のデータ値をルックアップするために用いられる。この例において、指定された列タイトル「B」および「C」の対応する値は、それぞれ、「b」および「c」である。
この例では、上述のように、列Aが大文字化動作によって変更されたので、ファイルセット888から取得される列Aのバージョンがもはや有効/現行ではなく、列Aファイルのそのバージョンから値が取得されるべきでないことを示すために、列タイトル「A」は、参照スタック858の行862から除去されている(下線によって示されている)。したがって、ファイルセット888内の列Aの値は取得されなかった。
上で示したように、動作によって変更される列については、新しい列ファイル(および対応するルックアップテーブル)のみが書き込まれる。参照スタックは、最新の(パイプラインの或る対応するステージの時点の)バージョンの列が位置する場所(すなわち、ファイルセットの位置、および、どの列がそのファイルセットから読み出されるのか)を示すために、部分的に用いられる。
2つのファイルセットから取得された値は、共に組み合わせられて、データセットDS1(「A」、「b」、「c」)のインポート後に大文字化を列Aに実行した累積結果の1番目の行を生成する。
結果の残りの行は、参照テーブルの行を下がって、上述したのと同じ処理を実行することによって決定される。この順で参照に対してデータトラバーサルプログラムを実行することにより、パーティション0のためのデータトラバーサルプログラムを用いて取得される全体結果のその一部は、正しい順序になる。
同様の処理が、パーティション1に実行される。次いで、パーティション0およびパーティション1について取得された部分結果は、全体結果を形成するように組み合わせられ、ここで、パーティション0から取得された結果の一部は、パーティション1からの結果の一部の前に置かれる。
この例で示したように、2つの異なるファイルセットが、入力データセットに実行された複数の動作から結果として得られたデータセット内の単一の行を構成する値を決定するためにアクセスされた。
フィルタ
図6Aのスクリプト600の例に続いて、列Aに大文字化を実行した後、パイプラインの次のステージ/一連の順序付けられた動作における次のステップは、列Bに対するフィルタリングである。特に、データは、添付の基準に従って列Bにフィルタリングされる、すなわち、列Bにおいて値「e」および「h」に関してフィルタリングされる。これは、データセット内の総行数(および各パーティション内の行数)を潜在的に削減する。
フィルタリング動作においては、データ値は変更されない。したがって、変更される列がないので、動作の結果として、新しいファイルセットは全く書き込まれない。しかしながら、パーティションのデータトラバーサルプログラムによって表される行の数は減少しうる。したがって、パーティションの参照テーブルおよび参照スタックは、これを反映するように更新される。
実施形態の一例において、データトラバーサルプログラム(ならびに参照テーブルおよび参照スタック)の状態は、図9Aを参照して以下に述べるように決定/更新される。
図9Aは、フィルタ動作の結果を反映するようにデータトラバーサルプログラムを更新するための処理の一実施形態を示す。いくつかの実施形態において、図9Aで実行される処理は、1または複数のパイプラインエグゼキュータ(例えば、Sparkワーカ)がパーティション(パーティション0など)に働きかけることによって実行される。いくつかの実施形態において、(行がフィルタ動作の結果としてパーティション間を移動しないため)各エグゼキュータは独立的にその作業部分に作用する。
参照テーブルは、以下のように更新される。ステップ1(902)で、パーティションのための(列Aの大文字化が実行された時点の)現在の参照が取得される。いくつかの実施形態において、取得される参照は、図8Aの参照テーブル820から取得される。テーブル904内の参照の各行は、列Aへの大文字化動作まで順序付けられた動作のセットを実行した累積結果における特定の行を表す。
ステップ2(906)で、テーブル904によって表される行に対応する列Bの値が取得される。いくつかの実施形態において、それらの値は、上述のように参照および対応する参照スタックを用いてデータトラバーサルを実行することによって取得される。いくつかの実施形態において、 値を取得するために用いられる対応する参照スタックは、図8Aの参照スタック814である。いくつかの実施形態において、列Bの値を用いて追加される列は、テーブル904の右側に追加され、変更されたテーブル918を生成する。
ステップ3(908)で、テーブル918は、フィルタ基準(列Bの値「e」および「h」に関するフィルタ)に従ってフィルタリングされる。フィルタの結果は、910に示されている。例えば、Spark実装例では、Sparkフィルタ動作が、(RDDとして表される)テーブル918上で呼び出される。フィルタ変換は、テーブル918内の行の一部を備えた新たなRDDを返し、これは、910に示されている。ステップ4(912)で、列Bの値が削除され、結果として、参照だけを含むテーブル914が得られる。これらの参照は、フィルタリング動作後に残る行を表す。ステップ5(916)で、テーブル914は、パイプラインのこのステージで更新された参照として保存される。
参照スタックに関しては、新たな列データが書き込まれていないので、参照スタックは、フィルタステップで更新される必要がない。いくつかの実施形態において、保存は、フィルタリング後に自動的に実行され、これは、現在の参照テーブルの保存を含む。保存の実行時、いくつかの実施形態において、新しいエントリ(行)が、参照スタックの上部に置かれる。いくつかの実施形態において、参照スタックの新しい行は、後の利用のためにリトリーブできるように、保存された参照テーブルに対するハンドル/キャッシュ識別子を含む。例えば、いくつかの実施形態において、参照テーブルは、ハンドル/キャッシュ識別子を部分的に用いて参照されるファイルセットの一部として格納される。この例において、ファイルセットは、参照テーブルのみを含み、ルックアップテーブルも列ファイルも含まない(新しい列データが書き込まれていないため)。参照スタックの新しい行の列部分は、空である。参照テーブル内の対応する列も生成される。
この結果として、図9Bに示すデータトラバーサルプログラムが得られる。
図9Bは、データトラバーサルプログラムの実施形態の一例を示す。この例では、値「e」および「h」に関して列Bにフィルタ動作を実行した結果を表すパーティション0のための更新されたデータトラバーサルプログラムが示されている。データトラバーサルプログラムは、更新された参照テーブル952 を含んでおり、これは、例えば、図9Aに記載された処理を用いて生成されたものである。上述のように、保存が動作後に実行されたので、変更されたデータがなくても、参照スタック954は、パイプラインの以前のステージから更新されている。
パイプラインのこのステージでの累積結果を読み出すために、パーティション0(およびその他の論理パーティション)のためのデータトラバーサルプログラムが、上述したのと同様の方法で実行される。例えば、図9Bに示したデータトラバーサルプログラムは、インポート動作後の大文字化動作後にフィルタ動作を実行した累積結果の一部(累積結果の最初の2行)を取得するために実行されうる。いくつかの実施形態において、参照スタックエントリの行で指定された列がない場合、読み出されるデータ値はない(すなわち、データトラバーサルプログラムに関連する列を備えた参照スタックエントリのみが読み出される)。したがって、図9Bに示したデータトラバーサルプログラムを実行することにより、956に示す結果が得られる。
図に示すように、累積動作の結果は、データトラバーサルプログラム内に反映されるが、それらの累積結果を達成するために正確にどの動作が実行されたのかという示唆は、データトラバーサルプログラム内に必ずしも存在しない。いくつかの実施形態において、パイプライン内の特定のステージのデータトラバーサルプログラムをキャッシュする時、累積結果を達成するために実行されたステップに基づいて、1または複数のシグネチャのセットが構築/生成される。1または複数の生成されたシグネチャは、キャッシュされたデータトラバーサルプログラムに割り当てられる。
図に示すように、フィルタ動作時点のデータの状態に到達するために実行された処理は、列Bの値を直接見て、それらの値をフィルタリングすることで、データセット内にどの行が残るのかを決定する処理である。残ったそれらの行のみが、フィルタステップの時点で更新された参照テーブル内に反映される。このデータ表現を用いてフィルタリングを実行した時には、新しいデータは書き込まれていない。むしろ、フィルタの結果としての行の削減が、参照テーブルにおける行数の削減に捕らえられ、列Bの値だけを見ることによって達成された。これは、結果を書き出すその他のフィルタリング技術と対照的であり、ここで、フィルタリングされたデータセット全体を書き出すコストは、データセットの総列数の関数である。ここで、結果のコンパクト表現は、順序付けられたデータ準備動作のセットの累積結果を反映するように更新される。
図6Aのスクリプトに関して上述した動作例は、パーティション間の情報の移動をもたらさない。以下の例では、パーティションにわたる参照の移動をもたらす動作(ソート)(例えば、ここでは、行がパーティションを交換する)が示される。
ソート
図10Aは、ソートされるデータセットの一実施形態を示す図である。このソート動作例を通して、ソートされるデータセット(1000)は、「DS」と呼ばれる。データセット1000は、2つの列(C0およびC1)と、4つの行とを含む。
図10Bは、データトラバーサルプログラムおよびファイルセットの一実施形態を示す図である。図10Aの例に続いて、データセットDSが、各々2つの行を備えた2つのパーティション(パーティション0およびパーティション1)に分割され、1010および1016に示すように、インポートされたと仮定する。この例において、パーティション0は、データトラバーサルプログラム1012を初期化し、ファイルセット1014を書き込んだ。この例において、ファイルセット1014は、「import_ds_p0」と名付けられる。同様に、パーティション1は、データトラバーサルプログラム1018を初期化し、ファイルセット1020を書き込んだ。この例において、ファイルセット1020は、「import_ds_p1」と名付けられる。パーティション0の参照スタックおよびパーティション1の参照スタックのキャッシュ識別子は両方とも、同じキャッシュ識別子/ハンドル「Import_ds」を備える。いくつかの実施形態において、各パーティションは、自身の計算の場所にローカルにそれぞれの書き込まれたファイルセットを格納する。
この例において、ソート条件C0は、データセットの行が移動すべき場所を決定するために用いられる。いくつかの実施形態において、Sparkなどの分散型計算プラットフォームが、(参照によって表された)行を正確な位置へ移動させる作業(すなわち、パーティション間で参照を移動させることによって表されるソートによる行の移動)を実行するために利用される。
この例において、ソートは、C0に実行される。図10Cは、ソートされた結果の一例を示す。ソートの前のデータセットDSが、1030に示されている。データセットDSへのソート動作の結果が、1032に示されている。図に示すように、データセットDSの行1034および1036が、ソート動作により位置を入れ替える。ソート動作の結果を表すためのデータトラバーサルプログラムの更新に関与する処理については、後に詳述する。
図10Dは、ソート動作を実行するための処理の一実施形態を示す図である。この例において、ソート動作は、部分的には、キー/値ペアを生成してソートすることによって実施される。キー/値ペアは、データが、値およびその値を特徴付ける何らかのキーとして表されることを可能にする。以下の例において、キーは、それに関してソートが実行されるものである。この例で示すように、キー/値ペアが生成され、ここで、キー/値ペアの値は、(参照のセットによって表された)行であり、キーは、その行のためのC0の実際のデータ値である。次いで、キー/行ペアは、キーによってソートされ、それにより、行(参照)は、(例えば、パーティションにわたって)再配列される。ソート動作処理の一実施形態は、以下のように実行される。以下に示すように、処理の結果は、インポートされたデータセットDSへのソート動作の結果を表す更新されたデータトラバーサルプログラムのための更新された参照テーブルである。
ステップ1(1040)で、データセットDSのすべての行が取得される。データセットDSの各行は、1または複数の参照のセットを用いて表され、参照のセットは、図10Bのデータトラバーサルプログラム1012および1018から取得される。この例において、線1042より上の参照は、パーティション0のデータトラバーサルプログラム1012から取得されたものである。線1042より下の参照は、パーティション1のデータトラバーサルプログラム1018から取得されたものである。いくつかの実施形態において、ステップ1に示された参照は、各パーティションのための参照テーブルである。
ステップ2(1044)で、各行のC0の値が追加される。以下に示すように、C0の値は、各行のキーとして用いられる。次いで、ソートが、キーに関して実行される。いくつかの実施形態において、各行のC0の値は、上述のようにそれぞれのファイルセットからC0の値をルックアップするために、図10Bのデータトラバーサルプログラム1012および1018を実行することによって取得される。
ステップ3(1046)で、C0に関するキーが生成される。このステップにおいて、取得されたC0の値は、キー/行ペアを生成するために、それらに対応する行(参照)とペアになったキーとして用いられる。いくつかの実施形態において、ステップ3では、ステップ2で取得された値が、キー位置に抽出される。いくつかの実施形態において、ステップ3は、キー/行すなわちキー/値ペアの生成への中間工程である。ステップ4(1048)では、ステップ2で取得された値が、行から削除される。これにより、1050に示すように、4つのキー/値ペアのセットが得られる。
いくつかの実施形態において、キー/値ペアは、参照テーブルを適所に操作することによって生成される。最初に、参照テーブルが、ステップ1に記載されるように取得される。C0の値は、ステップ2でファイルセットから引き出され/抽出され、参照テーブルの追加セルとして(例えば、参照テーブルの右に追加された新しい列内に)追加される。C0の値は、(左位置がキー/値ペアの「キー」位置に対応するため)参照テーブルの左にC0の値をコピーすることによってキー/値ペアを作成するためにコピーされる。参照テーブルの右のセルにある抽出された値は、記憶空間を節約するために、削除される。キー/値ペアは、本明細書では「キー/行ペア」とも呼ばれる。
いくつかの実施形態において、キー/値ペア生成は、様々なパーティション/ワーカがファイルセットからの行に入り込んで、キーとして用いられる対応するC0の値を取得するので、様々なパーティション/ワーカによって並列で実行される。
ステップ5(1052)では、ステップ4で生成されたキー/行ペア1050は、キーで(例えば、キー/行ペアに関するSpark「sortByKey」コマンドを発行することによって)ソートされる。「sortBykey」コマンドの結果が1054に示されており、ここで、キー/値ペアは、キー値(すなわち、C0の値)でソートされている。図に示すように、キー/行ペア1056およびキー/行ペア1058の位置は、「sortByKey」コマンドの結果として入れ替えられている。
ステップ6(1060)で、1054のキーは、参照のみが残るように除去される。キーは、ソートのためのキー/値ペアを形成するために追加されたので、もはや必要ないため、除去される。キーの除去後、参照1062のみが残る。この例では、保存ポイントが、ソート動作後に作成されるので、ステップ6で、参照チェックポイントも作成される(ここで、いくつかの実施形態において、各保存は、参照チェックポイントを作成する)。いくつかの実施形態において、参照チェックポイントの作成は、上述のフィルタリング動作と同様に、参照テーブルの更新および保存を含む。フィルタリング動作と同様に、参照の新しい列が追加される(1068に示されている)。この例において、列1068は、列1062の左に追加される。列1068内の新しいエントリは、列1062内のそれらに対応する参照の更新されたパーティション/行識別子に基づいて、参照値を割り当てられる。例えば、(線1066より上の)列1062内の上2つの参照は、パーティション0に関連付けられる。したがって、線1066より上の列1068内の上2つの対応する値は、(0,0)および(0,1)である。同様に、列1062内の下2つの参照は、パーティション1に関連付けられる。したがって、線1066より下の列1068内の下2つの対応する値は、(1,0)および(1,1)である。ソート動作後に保存が実行されない場合、列1068は、追加される必要がない。
いくつかの実施形態において、(参照テーブルが保存されるので)参照チェックポイントを作成する一環として、新しい行が、上述のフィルタ動作のように、対応する参照スタックの上に追加される。例えば、参照スタック内の新しい行は、対応する保存された参照テーブルへのハンドル/キャッシュ識別子を含むが、行の列部分は空いたまま残される。参照スタックのこの新しく追加された行は、参照テーブルに追加された新しい列に対応する。いくつかの実施形態において、ソート動作後に実行される保存がない場合、新しい行は、参照スタックに追加される必要はない。
更新された参照テーブルおよび参照スタックの例を、図10Eに示す。
ステップ7(1064)で、参照が保存される。この例において、線1066より上の参照は、パーティション0のための新しく更新された参照テーブルとして保存される。線1066より下の参照は、パーティション1のための新しく更新された参照テーブルとして保存される。
一実装例において、ステップ1〜7は、以下のように実装/実行される。パーティション0および1は、別個に並列でステップ1〜4を実行する。いくつかの実施形態において、パーティションは、ステップ1〜4を実行して、一度に1つのキー/値ペアを(すなわち、順次)取得する。キー/値ペアは、並列で動作するパーティションによって生成されるので、コレクタ(例えば、Sparkコレクタ)へパーティションによってストリーミングされる。例えば、コレクタは、各パーティションによって、(すなわち、(存在する場合)次のキー/値ペアを取得するためにイテレータ「next」を求めることによって)、一度に1つのキー/値ペアを読み出すためにコレクタが用いるイテレータを提供される。次いで、コレクタは、様々なイテレータからキー/値ペアを受信すると、キー/値ペアをソートする。ソートの完了後、コレクタ自体が、イテレータを返し、そこから、ソートされたキー/値ペアが順次にストリーミングされうる。ソートされたキー/値ペアは、それらに適切なパーティションにストリーミングされる。これは、参照がそれらに適切なパーティションに分散されることを可能にする。いくつかの実施形態において、グローバルソートが実行される。次いで、キー/値ペアは、それらに適切なパーティションに送信される。次いで、キー/値ペアが正確な順序であることを保証するために、ローカルソートが、パーティション内で実行される。
図10Eは、データトラバーサルプログラムの実施形態の一例を示す。この例では、C0へのソート動作の時点で更新されたデータトラバーサルプログラムが、(上述した図10Dの処理を用いて)示されている。パーティション0のためのデータトラバーサルプログラムは、1070に示されている。データトラバーサルプログラム1070のための参照テーブルは、図10Dのステップ6(1060)の線1066より上の参照を用いて生成された。パーティション1のためのデータトラバーサルプログラムは、1072に示されている。データトラバーサルプログラム1072のための参照テーブルは、図10Dのステップ6(1060)の線1066より下の参照を用いて生成された。
この例では、フィルタ動作と同様に、新しいデータ(列)は、ソート後に書き込まれなかった。しかしながら、ソート動作の結果が保存され、上記のステップ6で参照チェックポイントが生成されるので、新しいエントリ/行が、1074および1076で示すように、参照スタックの上部に置かれている。列が書き込まれなかったので、新しい行の列部分は空である。保存がなされなかった場合、各パーティションのための参照スタックは、同じままである。
この例で示すように、上述のソート動作処理の結果として、参照(1,0)および(0,1)は、パーティションを交換した。1つのパーティションのためのデータトラバーサルプログラムが、2つのパーティションからの参照をその参照テーブル内に含むが、データトラバーサルプログラムによって維持された結果の一部を読み出すためのそれらのデータトラバーサルプログラムの実行は、上述したのと同じ方法で実施される。
例えば、単一のパーティションのための参照テーブルが、異なるパーティション由来の2つの行を含むので、それらの行の値は、2つの異なるファイルセット(例えば、図10Bのファイルセット1014および1020)から取得される必要がある。しかしながら、パーティションのための参照スタック内のキャッシュ識別子は1つだけである。上記の例に記載の方法でデータトラバーサルプログラムを実行することにより、両方のファイルセットにアクセスすることができる。これは、部分的には、ファイルセット1014および1020の名前が同じベース/ハンドル「import_ds」を共有することによる。したがって、データトラバーサルプログラムの実行時、適切なファイルセットが、評価されている参照/座標のパーティション識別子を参照スタック由来のベース/ハンドル「import_ds」キャッシュ識別子と組み合わせることによって取得される。いくつかの実施形態において、ファイルセットは、それらを書き込んだパーティションにローカルに格納される。行がパーティションを交換すると、いくつかの実施形態において、それに対応するファイルセットが、行が移動されるノード上でローカルに複製される。これは、ファイルセットが、ローカルにアクセス可能になることを可能にし、値の取得速度を改善すると共に、(例えば、ノード間でのデータの転送時の)ネットワーク帯域幅を低減する。別の実施形態では、ファイルセットは複製されず、参照される。
上記の例のソート処理に示したように、キーでソートされるキー/値ペアの生成など、ソート動作の一部が、適所で実行される。これは、メモリ最適化を提供し、ここで、キー/値マッピングを格納するために新しいメモリ空間は作成されない。むしろ、既存のデータエントリが、ソート可能なフォーマットになるまで修正される。さらに、ファイルセットから読み出された唯一の値は、C0の値であった。データセットの行の移動は、参照によって表され、C0の値だけのソートに基づいて決定された。次いで、参照が、ソートの結果を反映する更新されたデータトラバーサルプログラムを作成するために、異なるパーティションに移動された。
これは、ソート動作がSparkなどの計算プラットフォームにおいてネイティブに処理される方法とは対照的である。例えば、Sparkでは、上述したような参照の書き込みよりも大量のデータを含む実際のデータが移動および書き込みされるため、よりコストが掛かる。
図10Fは、ネイティブSparkソートの実施形態の一例を示す。この例では、開始1080で、データセット1082が、分割ライン1084で示すように、Sparkによって2つのパーティションに分割されていると仮定する。この例では、データセット内の各行が、多数の値を有してよく、すべての値がSparkによって処理される。これは、本明細書に記載の技術と対照的であり、ここで、実際のデータのセット全体に動作を実行するのではなく、データセットの行を表す参照が操作される。1086で、C0の値によるキー作成が、キー/値ペアを生成するために実行される。1088で、キー/値ペアがキーでソートされる。次いで、キーは、結果としてのデータセットを取得するために、1090で削除される。この例に示すように、動作は、データセット全体のすべてのデータから開始し、すべてのデータが、動作全体を通して保持される。この結果として、データセット全体を収容するために、中央処理ユニット(CPU)リソース、メモリリソース、ディスクリソース、(例えば、パーティション間でデータセット全体を移動させるための)帯域幅など、リソースを潜在的に大量消費する。本明細書に記載の技術を用いれば、実際のデータセットに作用するのではなく、データセットのコンパクト表現(例えば、データトラバーサルプログラム)が処理されて、データ値が、必要な時にのみ取得される。これは、はるかに少量のデータが、順序付けられた動作のパイプラインを通して処理されることを可能にし、データ準備を実行する効率を改善する。
上記では、単一のデータセットに関する動作が実行された。付加および結合のデータ準備動作の以下の例では、複数のデータセットが組み合わせられる。組み合わせる前のデータセットは、それぞれ潜在的に、組み合わせられる前に独自のパイプラインを通して処理されている場合がある。以下に示すように、組み合わせられたデータセットに対して結果として得られるデータトラバーサルプログラムは、それらに起こったことの複数の履歴を持つパーティションを備えることになる。
付加
図11Aは、付加動作を含むスクリプトの実施形態の一例を示す。1102で、インポートされる第1データセット(これらの例では「DS1」と呼ぶ)の位置が指定される。1104で、インポートされる第2データセット(これらの例では「DS2」と呼ぶ)の位置が指定される。1106で、付加動作が指定される。付加動作を指定する一環として、付加されるデータセットの1つが、駆動(アンカー)テーブルとして指定され、それに対して他のテーブルが付加される(「付加テーブル」と呼ばれる)。この例において、DS1は駆動テーブルであり、DS2は付加テーブルである。スクリプト1100の例では、DS1およびDS2内のどの列を付加するのかについての仕様も示されている。この例では、DS1の列C00が、DS2のC01にマッピングされる。DS1の列C10が、DS2の列C11にマッピングされる。データセット例DS1およびDS2、ならびに、スクリプト1100内で指定された条件に基づいて結果として付加されるデータセットについて、図11Bを参照して記載する。
図11Bは、付加されるデータセットの実施形態の一例を示す。この例において、データセットDS1は、1110に示されている。データセットDS2は、1112に示されている。結果として得られる付加されたデータセットは、1114に示されている。図に示すように、DS1は、図11Aのスクリプト1100に従って駆動テーブルとして指定されているので、DS2は、DS1の下に付加されており、ここで、DS2の列C01は、DS1の列C00に付加され、DS2の列C11は、DS1の列C10に付加され、それらのマッピングは、図11Aのスクリプト1100に記述されたものである。付加されたデータセットのための列の再命名も示されている。例えば、DS1の列C00に付加されたDS2の列C01を含む新しい列は、列「C0」と再命名されている。同様に、DS1の列C10に付加されたDS2の列C11を含む新しい列は、列「C1」と再命名されている。
図11Cは、2つの異なるデータセットのためのパイプラインに関連する論理ファイル/名前空間の実施形態の一例を示す。この図には、DS1およびDS2が示されており、それらは、付加動作の前にインポートされた。図の例において、DS1およびDS2は、独自のそれぞれのパイプラインでインポートされた(ここで、或るパイプラインがDS1に対して宣言され、別個のパイプラインがDS2に対して宣言された)。いくつかの実施形態において、パイプラインを宣言することは、(例えば上述のように)データセットをインポートし、データセットに適用される変換ステップを宣言することを含む。DS1のパイプライン1120において、DS1は、2つのパーティション(パーティション0および1)に分割され、各パーティションはDS1の2つの行を備える。パーティション0および1のためのデータトラバーサルプログラムは、それぞれ、1122および1124に示されている。DS1の上の2行は、パーティション0のデータトラバーサルプログラム1122によって表され、DS1の下の2行は、パーティション1のデータトラバーサルプログラム1124によって表される。DS2のパイプライン1126において、DS2は、3つのパーティション(パーティション0、パーティション1、および、パーティション2)に分割され、各パーティションはDS2の1行を含む。パーティション0、パーティション1、および、パーティション2のためのデータトラバーサルプログラムは、それぞれ、1128、1130、および、1132に示されている。DS2の上の行は、パーティション0のデータトラバーサルプログラム1128によって表され、DS2の真ん中の行は、パーティション1のデータトラバーサルプログラム1130によって表され、DS2の下の行は、パーティション2のデータトラバーサルプログラム1132によって表される。それらのパーティションによって書き込まれた対応するファイルセットも示されている。いくつかの実施形態において、データセットDS1およびDS2は、異なるパイプラインにあり、独立して分割された。
この例では、独立したパイプラインがDS1およびDS2に対して宣言されたので、各パイプラインのための論理パーティションの番号付けは、いずれも0から始まる。いくつかの実施形態において、各パイプラインは、独自の名前/ファイル空間に関連付けられる。
図11Dおよび図11Eは、それぞれ、付加動作前後のデータトラバーサルプログラムの実施形態の一例を示す。図11Dに示すDS1空間およびDS2空間におけるパーティションおよび対応するデータトラバーサルプログラムは、図11Cに示したDS1空間およびDS2空間におけるパーティションおよび対応するデータトラバーサルプログラムに対応する。
いくつかの実施形態において、2つのデータセットを付加することは、付加の結果のための新しいパイプラインを作成することを含む(例えば、新しいパイプラインが、新しい付加されたデータセットに対して宣言される)。パイプラインは、独自のファイル/名前空間およびパーティションを備える。この例の付加において、新しいパイプライン内のパーティションの数は、一緒に付加されるデータセットのための2つのパイプラインにわたるパーティションの総数に等しい。例えば、DS1がM個のパーティションを備え、DS2がN個のパーティションを備えていた場合、新しいパイプラインは、M+N個のパーティションを備える。したがって、この例において、DS1パイプラインは2つのパーティションを備え、DS2パイプラインは3つのパーティションを備えるので、結果として得られるパイプライン(本明細書では「プロジェクト」パイプラインと呼ぶ)は、5つのパーティションを備える。
付加動作は、DS1の行の下にDS2の行を効果的に配置する。以下に示すように、この結果は、単一のパイプライン(新しい「プロジェクト」パイプライン)の下にDS1およびDS2のパーティションすべてを配置することによって表される。そうすることにより、それらのパーティションは、(付加の前であるために2つの別個のデータセットではなく)1つの単一データセットとして扱われる。単一のパイプラインの下にパーティションを配置する場合、(対応するデータトラバーサルプログラムを含む)パーティションは、それらの順番付けが、付加されたデータセット内の行の新しい配列を反映するように、番号を付け直される(すなわち、パーティションは、それらの元々のパイプライン空間から新しいプロジェクトパイプライン空間に再マッピングされた)。結果として得られる「プロジェクト」パイプライン空間の一例について、図11Eを参照して説明する。
図11Eは、パイプラインファイル/名前空間内のパーティションの一例を示す。この例では、「プロジェクト」パイプライン1140が、付加動作の一環として宣言された。プロジェクトパイプライン1140は、5つの論理パーティションを備える。
図に示すように、新しいパイプラインの各パーティションは、DS1およびDS2のパイプライン空間内の既存のパーティションに対応する。この例において、プロジェクトパイプラインのパーティション0は、DS1空間のパーティション0に対応する。プロジェクトパーティション1は、DS1空間のパーティション1に対応する。
DS2はDS1の下に付加されるので、DS2パイプライン空間のパーティション0は、新しいプロジェクトパイプライン空間のパーティション2に対応する。プロジェクトパイプライン空間のパーティション3は、DS2パイプライン空間のパーティション1に対応する。プロジェクトパイプライン空間のパーティション4は、DS2パイプライン空間のパーティション2に対応する。
図に示すように、DS1パイプライン空間およびDS2パイプライン空間のパーティションは、プロジェクトパイプラインの新しい空間の下で効果的に再分割されている。再分割の一環として、DS1およびDS2からのパーティションは、DS2の行がDS1の行に続くことを表すように再番号付けされる(例えば、付加テーブルのDS2パーティションは、アンカーテーブルのDS1パーティションに続くように番号付けされる)。
図に示すように、各新しいパーティションは、それに対応するDS1またはDS2パーティションからデータトラバーサルプログラムを継承する。例えば、参照テーブルおよび参照スタックが継承される。移動または変更されるデータはないので、参照スタックは、既存ファイルセットへの参照を含み、構造は同じままである(例えば、ここで、付加動作処理であるため、参照スタックの上に新しいエントリは置かれない)。1つの変更点は、参照スタックによって参照されたファイルセットに見られる列の名前付けにある。列名は、元々はDS1およびDS2内でのそれらの元々の名前で呼ばれたが、互いにマッピングされた付加された列のための新しい共通の名前を示すよう名前を変更される。いくつかの実施形態において、元々の列名と、それらが参照する対応する新しい名前との間のマッピングの記録/ブックキーピングが維持される。この例において、DS2の列C01は、DS1の列C00に付加される。両方の列は、共通の列名「C0」にマッピングされる。同様に、DS2の列C11は、DS1の列C10に付加される。両方の列は、共通の列名「C1」にマッピングされる。
上記の例において、パーティションは、新しく宣言されたパイプラインの下に追加された。いくつかの実施形態において、付加テーブルのパーティションは、アンカーテーブルのパイプラインへ引き込まれ/組み込まれ、それに応じて再番号付けされる(すなわち、DS2のパーティションは、DS1によって消費されるように再分割される)。例えば、DS2のパーティションは、再割り当てされてDS1パイプラインに組み込まれ、DS1パーティションの最後のパーティション番号に連続して続くように番号付けされる。いくつかの実施形態において、付加内で互いにマッピングされた列の新しい名前を生成するのではなく、付加テーブル内の列は、アンカーテーブル内の対応する列の名前を引き継ぐ(例えば、DS2の列C01は、DS1パイプラインに組み込まれた時に、DS1の列C00の名前を引き継ぐ)。
新しいパイプライン内のこの新しい付加されたデータセットからのデータは、上述したのと同じ技術を用いて読み出される。この例において、プロジェクト空間の各パーティションのデータトラバーサルプログラムは、付加の結果の順序付けられた一部を取得するために実行される。付加の結果全体に到達するために、複数の一部が組み合わせられ、対応するパーティション番号によって順序付けられる。図に示すように、結果全体を組み立てる時、データ値が、2つの異なるデータセットのために元々書き込まれたファイルセット(例えば、図11Cに示したファイルセット)から引き出される。付加の結果は、新しい列名「C0」および「C1」を有するが、ファイルセットのルックアップを実行する時、ルックアップを実行して適切な列の値を取得するために、DS1およびDS2における元々の名前に対する新しい列名について維持されたマッピングが用いられる。
したがって、付加動作において、上述の処理は、付加されたデータセットの仮想表現を作成し、ここで、付加されたデータセットのパーティション(および対応するデータトラバーサルプログラム)は、完全に単一のデータセットとして処理されるように、現在では単一の論理空間下に置かれている。さらなる動作(例えば、順序付けられたデータ準備動作のセット)が、新しい論理単一データセットに実行されてよく、その一例を以下に記載する。
付加の例−付加の前のDS2.C11への小文字化
上記の例に示されるように、別個のパイプラインが、元々は、DS1およびDS2に対して宣言されていた。以下の例では、付加を実行する前に、小文字化動作がDS2の列C11に実行されたが、インポート後にDS1にはさらなる工程は実行されなかったと仮定する。
図11Fの例では、インポート動作の時点でのDS1パイプライン空間のパーティションおよび対応するデータトラバーサルプログラムの状態が示されている。DS1をインポートした時に書き込まれた対応するファイルセットは示されていない。
図11Fの例では、さらに、DS2をインポートした後にDS2の列C11に小文字化を実行した結果として、DS2パイプライン空間のパーティションおよび対応するデータトラバーサルプログラムの状態が示されている。小文字化動作により書き込まれたファイルセットも示されている。DS2をインポートした時に書き込まれたファイルセットは示されていない。いくつかの実施形態において、図のデータトラバーサルプログラムおよびファイルセットは、図7A〜図8Bを参照して説明したのと同様の技術を用いて生成される。
DS1およびDS2(付加の前のそれらの仮想表現が図11Gに示されている(図11Fに示したそれらと同等の表現に対応する))は、DS1およびDS2パイプライン空間内のパーティションを新しい第3「プロジェクト」パイプラインに、上述のように、再マッピング/再分割することによって、仮想的に付加される。付加動作の結果の仮想表現は、図11Hに示されている。参照スタック内の列の再命名も示されており、データ値が書き込まれたり移動されたりしていないので、参照スタックの構造も変化していない。
この例に示すように、DS1パイプラインのパーティション0〜1が、新しいプロジェクトパイプラインのそれぞれパーティション0〜1へ再マッピングされた。DS2パイプラインのパーティション0〜2は、新しいプロジェクトパイプラインのそれぞれパーティション2〜4へ再マッピングされた。追加の小文字化動作が、付加の前にDS2の列C11に実行されたので、パーティション2〜4の参照スタックは、プロジェクトパーティション0〜1よりも多いエントリを有する。さらに、パーティション2〜4のための参照テーブルは、パーティション0〜1のための参照テーブルと比較して、さらに列を含む。したがって、同じパイプライン内のパーティションが、異なる参照スタックおよび参照テーブルを有する。これは、付加される前のデータセットの履歴を反映している。
付加の結果を読み込む時、プロジェクトパイプライン空間のパーティションが、(例えば、図7Bおよび図8Bを参照して)上述したのと同じ技術を用いて読み出される。例えば、(単一の(仮想)データセットに対する動作を表す)プロジェクトパイプラインのパーティションがアクセスされる。パーティションのためのデータトラバーサルプログラムが取得される。ルックアップするための参照、ファイルハンドル、および、列が、データトラバーサルプログラムから取得される。これらのアイテムは、ファイルセットをロケートするためのファイルハッシュ(または任意の他のファイル名表現)を決定するために一緒に用いられる。ルックアップが、指定された列の値を取得するために、見つかったファイルセット上で実行される。そうすることにより、パーティションのデータトラバーサルプログラムによって表現された累積結果の一部が取得される。様々なパーティションから取得された累積結果のサブセットは、パーティション順に従って組み合わせられる。
付加の例−(付加後の)Proj.C1への小文字化
図11F〜Hの上記の例では、DS2がDS1に付加される前に、DS2の列C11への小文字化動作がDS2に実行された。以下は、図11A〜図11Eの例に続く一例であり、その例において、DS1およびDS2は、各々がインポートされた直後に付加された。この例では、DS1およびDS2が付加された後に、新しいプロジェクトの列C1への小文字化動作が実行される。
プロジェクトの列C1への小文字化を実行した結果の表現が、図11Iに示されている。この例では、プロジェクトのパーティションすべてが、小文字化動作の影響を受けており、したがって、(参照テーブルおよび参照スタックを含む)データトラバーサルプログラムすべてが、小文字化動作の結果を反映するために、(図11Eの仮想表現の状態から)更新された。
キャッシュフィンガープリントの例
例えば、図11F〜Hに示したように、第1ユーザが、付加の前にDS2.C11に小文字化を以前に実行し、その結果を保存/キャッシュしたと仮定する。例えば、キャッシュされた表現に添付されたシグネチャ/フィンガープリントが、キャッシュされた結果につながる実行されたステップを示唆すると仮定する(例えば、シグネチャは、動作のハッシュ、または、キャッシュされた結果につながる動作の文字列表現の連結、などである)。いくつかの実施形態において、フィンガープリントは、図11Jに示すツリー構造1150を生成するために用いることができ、ツリー構造1150は、インポートDS2ステップの後にDS2の列C11への小文字化が続くパイプラインを示す。
翌日、第2ユーザが、ステップエディタインターフェースを用いて、DS2をDS1に付加した後に、結果として得られるC1列に小文字化を実行したいことを指示すると仮定する。なお、それらの動作は、図11Eに関して説明した表現の生成をもたらした順序付けられたデータ準備動作のセットである。
2ユーザによって指定された動作の順序および異なる順序の動作の結果は異なるが、第2ユーザによって指定された第2セットの順序付けられた動作を実行する前に、以前にキャッシュされた表現が結果の少なくとも一部または全部を提供するために利用可能か否かを判定できる。
以下は、シグネチャ/フィンガープリントを用いて、既存のキャッシュされた表現が再利用できるか否かを判定する一例である。例えば、第2ユーザによって指定された第2セットの順序付けられた動作が、図11Kのツリー1160に対応するシグネチャを導出するために用いられると仮定する。以前にキャッシュされた表現のツリー表現1150も取得される。それらのツリーは、グラフまたは任意の部分グラフ/パスが2つの間で一致するか否かを判定するために比較できる。一致は、第2セットの順序付けられた動作の或る部分のキャッシュされた表現が存在することを示唆する。
この例において、1160および1150間には直接的な一致は見られない。いくつかの実施形態において、ツリー1160は、後に1150との比較もされうる等価なツリーを決定するために、さらに操作されうる。例えば、オペレータプッシュダウンが、1160に実行されうる。この例において、1160の小文字化動作は、ツリー1170を生み出すために、付加の下にプッシュダウンされる。ツリー1160および1170は、DS1およびDS2の付加の結果として得られたデータセットの列C1に小文字化を実行することが、付加の実行前に最初にDS1のC10およびDS2のC11に小文字化動作を実行したのと同じである点で、機能的/意味的に等価である。
ツリー1170および1150を比較すると、1170の部分グラフ1172が1150と一致すると判定される。例えば、部分1172のシグネチャ(例えば、部分1172における動作のハッシュ)が、キャッシュされた結果1150のシグネチャと一致する(例えば、等価のハッシュが特定された)。
次いで、ツリー1150を表すシグネチャに関連するキャッシュされた結果が取得されうる。この例において、シグネチャ1150に関連するキャッシュされた結果は、DS2の列C11内の値に小文字化動作を実行することに関連する。次いで、キャッシュされた結果は、第2セットの順序付けられた動作を実行するための計算量を削減するために利用できる。例えば、DS2の列C11内の値に小文字化動作を実行することに関連するキャッシュされた結果が存在するので、DS1のC10内のすべての値およびDS2のC11内の値の小文字化を計算するのではなく、DS1の列C10内の値にのみ、小文字化動作を実行すればよい。これは、実行される必要のある書き込みの量を削減する。次いで、DS1のC10への小文字化動作の結果は、第2ユーザが望む結果を取得するために、キャッシュされた結果に付加されうる。
結合
結合動作に関連する処理の実施形態の一例を以下に記載する。完全外部結合が以下の例に示されているが、本明細書に記載の技術は、任意のその他のタイプの結合(例えば、デカルト結合)を実行するためにそれに従って適合できる。
図12Aは、結合されるデータセットの一例を示す。この例では、ユーザが、DS1をアンカー/駆動テーブルとし、DS2をルックアップテーブルとして(すなわち、DS2がDS1に結合される)、列J1およびJ2についてデータセットDS1(1202)およびデータセットDS2(1204)の完全外部結合を実行したいと仮定する。その結果は、結合されたテーブル1206になる。結合動作は、例えば、ステップエディタユーザインターフェース(その例については後述する)を介してユーザによって指定されうる。
図12Bは、インポートされたデータの一例を示す。図12Aの例に続き、データセットDS1およびDS2は、1210および1220に示すように、それぞれのDS1およびDS2パイプライン空間に分割されインポートされた。各パーティションによって書き込まれた対応するファイルセットも示されている。パーティションのための(参照テーブルおよび参照スタックを含む)データトラバーサルプログラムの(インポート動作時点の)現在の状態も示されている。
この例では、図に示すように、DS1は、2つのパーティション(パーティション0およびパーティション1)に分割されている。DS1パイプライン1210のパーティション0は、参照テーブル1212および対応する参照スタック1214を備える。参照テーブル1212および対応する参照スタック1214を備えたデータトラバーサルプログラムが、DS1の上から2行を表す。DS1パイプライン1210のパーティション1は、参照テーブル1216および対応する参照スタック1218を備える。参照テーブル1216および対応する参照スタック1218を備えたデータトラバーサルプログラムが、DS1の下から2行を表す。
この例では、図に示すように、DS2は、2つのパーティション(パーティション0およびパーティション1)に分割されている。DS2パイプライン1220のパーティション0は、参照テーブル1222および対応する参照スタック1224を備える。参照テーブル1222および対応する参照スタック1224を備えたデータトラバーサルプログラムが、DS2の一番上の行を表す。DS2パイプライン1220のパーティション1は、参照テーブル1226および対応する参照スタック1228を備える。参照テーブル1226および対応する参照スタック1228を備えたデータトラバーサルプログラムが、DS2の下から3行を表す。
付加の例のように、新しいパイプラインが、結合の組み合わせの結果を表すために宣言される。完全外部結合の例において、新しいパイプライン空間(本明細書では「プロジェクト」パイプラインと呼ぶ)は、DS1およびDS2パイプライン空間にわたるパーティションの総数と同じ数のパーティションを含むことになる。完全外部結合に至るための処理の実施形態の一例を、図12C〜Eに関して以下に記載する。
図12C〜Eは、完全外部結合を実行するための処理の実施形態の一例を示す。いくつかの実施形態において、完全外部結合は、左外部結合および右アンチ結合を実行することによって実行され、それらの結果が、完全外部結合結果の仮想表現を生成するために付加される。以下に記載の9つのステップにおいて、最初の4つのステップは、左外部結合を実行するために用いられる。ステップ5〜8は、右アンチ結合を実行するために用いられる。ステップ9は、完全外部結合の表現を生み出すために、左結合および右結合の結果を組み合わせるために用いられる。これらのステップについて、以下に説明する。
左外部結合
図12Cは、左外部結合を実行するための処理の実施形態の一例を示す。いくつかの実施形態において、左外部結合の結果は、図12Bに示したDS1パイプライン1210のパーティション0および1のデータトラバーサルプログラム(すなわち、参照テーブルおよび参照スタック)を変更/修正することによって決定(および表現)される。ステップ1〜4で実行される処理は、データトラバーサルプログラムの各々に別個に実行されるが、ここでは例示ために一緒に図示されている。
ステップ1(1240)で、DS1のすべての行が取得される。DS1の行は、DS1空間のパーティションの参照テーブル(例えば、図12BのDS1パイプライン空間1210内のパーティション0および1の参照テーブル)に含まれる参照によって表される。いくつかの実施形態において、DS1のすべての行を取得することは、DS1のパーティションの各々のための現在の参照テーブルを取得することを含む。
例えば、図12BのDS1パイプライン空間1210のパーティション0の参照テーブル1212が取得され、二重線1242より上に示されている。同様に、DS1パイプライン空間1210のパーティション1の参照テーブル1216が取得され、線1242より下に示されている。
ステップ2(1244)では、ステップ1で取得された行/参照に対応するJ1の値の列が追加される。例えば、1つの列が、参照テーブル1212および1216の各々の右に追加され、対応するJ1の値で埋められ、結果として、それぞれ、テーブル1246および1248が得られる。いくつかの実施形態において、J1の値は、図12Bに示したように、DS1パイプライン空間1210のパーティション0および1に示されたデータトラバーサルプログラムを実行することによって取得される。
ステップ3(1250)で、J1の各値のためのDS2参照が示されている。このステップにおいて、DS1の列J1内の値と一致する値をJ2列に含むDS2の行(それらに対応する参照によって表される)が見いだされる。特定された行は、図12BのDS2パイプライン空間1220のパーティションの参照テーブルに示されるように、参照によって表される。
このステップにおいて、それぞれのJ1およびJ2の値において同じ値を共有するDS1およびDS2内の行が特定され、一緒にマッピングされる。これらの行は、結合された行を作成するために、水平に連結される。この例において、マッピングは、それぞれ、テーブル1252および1254を生み出すために、部分的には、テーブル1246および1248の右に追加の列(または、DS2内の行が複数の参照を用いて表される場合には、複数の列)を追加することによって実行される。列は、上述のように特定された適切なDS2参照で埋められる。
1254に示すように、J2列が値「C」を有するDS2には行が存在しない(すなわち、そのJ1列の値「C」に関連するDS1のパーティション1内の参照テーブル1216の最上行は、DS2内に一致する相手を持たない)。この例において、一致する行がないことは、
「
」シンボルで表されている(1256)。
ステップ4(1258)で、J1値列が、テーブル1252および1254から削除される。テーブル1252および1254の各々について、これは、DS1参照の列および対応する/一致するDS2参照の列のみを残す。列は、連結される。この例において、DS2値を含む列は、DS1値を含む列の左に連結される。
したがって、テーブル1252は、テーブル1260に変形され、テーブル1260は、DS1パイプラインのパーティション0のための新しい更新されたバージョンの参照テーブルとして保存される。同様に、テーブル1254は、テーブル1262に変形され、テーブル1262は、DS1パイプラインのパーティション1のための新しい更新されたバージョンの参照テーブルとして保存される。DS1パイプラインのパーティション1および0のための参照テーブルの各々が、(上記のステップ1〜3で決定された左外部結合条件に従って一致する)対応するDS2参照の新しい列を含むように更新されたので、対応する参照スタックも更新される。この例において、DS2の参照スタック(図12Bの1224および1228に示した)は、それぞれ、図12Bの参照スタック1214および1218の上部に連結されて、更新された三章スタック1264および1266を生成する。
したがって、DS1パイプラインのパーティション0および1のデータトラバーサルプログラムは、左外部結合を実行した結果を表すように変更されている。後に詳述するように、左外部結合は、完全外部結合を実行する際の中間工程であり、DS1の更新されたパーティション0および1は、付加を介して新しいプロジェクトパイプラインに分割し直される。
右アンチ結合
図12Dは、完全外部結合の右アンチ結合を実行するための処理の実施形態の一例を示す。いくつかの実施形態において、図12Dの処理は、12Cの処理から継続する。いくつかの実施形態において、右アンチ結合の結果は、図12Bに示したDS2パイプライン1220のパーティション0および1のデータトラバーサルプログラム(すなわち、参照テーブルおよび参照スタック)を変更/修正することによって決定(および表現)される。ステップ5〜8で実行される処理は、データトラバーサルプログラムの各々に別個に実行されるが、ここでは例示ために一緒に図示されている。
ステップ5(1268)で、DS2のすべての行が取得される。DS2の行は、DS2空間のパーティションの参照テーブル(例えば、図12BのDS2パイプライン空間1220内のパーティション0および1の参照テーブル)に含まれる参照によって表される。いくつかの実施形態において、DS2のすべての行を取得することは、DS2のパーティションの各々のための現在の参照テーブルを取得することを含む。
例えば、図12BのDS2パイプライン空間1220のパーティション0の参照テーブル1222が取得され、二重線1270より上に示されている。同様に、DS2パイプライン空間1220のパーティション1の参照テーブル1226が取得され、線1270より下に示されている。
ステップ6(1272)では、ステップ5で取得されたDS2の行/参照の列に対応するJ2の値の列が追加される。例えば、1つの列が、参照テーブル1222および1226の各々の右に追加され、対応するJ2の値で埋められ、結果として、それぞれ、テーブル1274および1276が得られる。いくつかの実施形態において、J2の値は、図12Bに示したように、DS2パイプライン空間1220のパーティション0および1に示されたデータトラバーサルプログラムを実行することによって取得される。
ステップ7(1278)で、テーブル1274および1276は、DS2のJ2列の値に一致するJ1列の値を有する対応するDS1の行(参照を用いて表される)が存在しないDS2の行を特定するためにフィルタリングされる。この例において、テーブル1274内には参照が残っておらず、結果として、空のテーブル1280になる。テーブル1276の1行だけが残り、結果として、テーブル1282になる。
ステップ8(1284)で、テーブル1280および1282のJ2値列が除去され、ステップ7のフィルタリング動作の結果として(存在する場合)残ったDS2参照だけが各テーブルに残される。したがって、テーブル1280は、空のテーブル1286に変形され、テーブル1286は、(「
」シンボルで表される)DS2パイプラインのパーティション0のための新しい更新されたバージョンの参照テーブルとして保存される。同様に、テーブル1282は、テーブル1288に変形され、テーブル1288は、DS2パイプラインのパーティション1のための新しい更新されたバージョンの参照テーブルとして保存される。この例において、DS2のパーティション0および1のための新しく更新された参照は、おれでもDS2参照を取得し、それらのパーティションのための参照スタックは、変更されない(例えば、図12Bの1224および1228に示したのと同じである)。
したがって、DS2パイプラインのパーティション0および1のデータトラバーサルプログラムは、右アンチ結合を実行した結果を表すように変更されている。後に詳述するように、右アンチ結合は、完全外部結合を実行する際の中間工程であり、DS2の更新されたパーティション0および1は、新しいプロジェクトパイプラインに分割し直される。
完全外部結合の結果の表現の決定
図12Eは、完全外部結合を実行するための処理の実施形態の一例を示す。いくつかの実施形態において、図12Eの処理は、12Dの処理から継続する。
ステップ9(1290)では、上述のステップ4およびステップ8の結果が一緒に付加される。いくつかの実施形態において、付加は、図11A〜Iに関して記載したのと同様に実行される。例えば、DS1およびDS2のパーティションは、新たに宣言されたパイプライン(「プロジェクト」パイプラインと呼ぶ)に分割し直され、新たなパイプラインは、新たなパイプライン内での順番にパーティションを再番号付けすることも含む。
この例において、DS1は駆動テーブルであるため、ステップ4の時点のDS1のパーティション0は、新しいプロジェクトパイプラインのパーティション0として分割し直され、図12Cに示したように、参照テーブル1260および対応する参照スタック1264を備えたデータトラバーサルプログラムを含む。ステップ4の時点のDS1のパーティション1は、新しいプロジェクトパイプラインのパーティション1として分割し直され、図12Cに示したように、参照テーブル1262および対応する参照スタック1266を備える。
この例において、DS2はルックアップテーブルであるため、ステップ8の時点のDS2のパーティション0は、新しいプロジェクトパイプラインのパーティション2として分割し直され、図12Dに示したように、参照テーブル1286および対応する参照スタックを備えたデータトラバーサルプログラムを含む。ステップ8の時点のDS2のパーティション1は、新しいプロジェクトパイプラインのパーティション3として分割し直され、図12Dに示したように、参照テーブル1288および対応する参照スタックを備えたデータトラバーサルプログラムを含む。
上記において、図12C(左外部結合)および12D(右アンチ結合)の処理は、順に説明された。いくつかの実施形態において、図12Cおよび図12Dの処理は、並列で実行される。次いで、左外部結合および右アンチ結合の結果は、一緒に付加され、図12Eに関して上述したように、完全外部結合結果の表現を決定する。
図12Eに示した完全外部結合の結果の仮想表現の例に示すように、プロジェクトパイプラインのパーティション0および1のための参照スタックは各々、交わりを持たないソースからのファイルセットおよびステップへの参照を含む。例えば、プロジェクトパーティション0および1のための参照スタックは各々、DS1パイプラインおよびDS2パイプラインの両方に対して生成されたファイルセットのためのハンドルを含む。
上述のように、本明細書に記載の技術を用いれば、1または複数の入力データセットに対する順序付けられた動作のセットが、データセットに対する動作の結果の仮想表現をもたらす。仮想表現は、データトラバーサルプログラムを含み、データトラバーサルプログラムは、実行されると、結果の実際のデータ値を出力する。
さらなる結合の例−結合前のDS2のJ2への小文字化
以下の例では、ユーザが、DS1と結合される前にDS2の列J2に小文字化を実行するよう決定すると仮定する。結合前のDS1およびDS2パイプライン空間のパーティションのデータトラバーサルプログラムの状態は、図12Fに示されている。
この例において、DS2内には、DS1の行内のJ1の値に一致するJ2の値を持つ行がない。図12C〜Eに関して上述したステップ1〜9を実行することにより、完全外部結合の結果は、図12Gに示すように表現される。
上に示したように、データトラバーサルプログラムなどの表現の利用など、本明細書に記載の技術は、様々な利点を有する。一例は、格納効率を高めることであり、ここで、動作の結果を表すために必要な記憶量が削減される。これは、例えば、データセットの実際の値ではなく、結果のコンパクトなデータトラバーサルプログラム表現を維持することによる。別の例として、動作によって変更されたデータのみが書き込まれるので、処理速度の効率も向上される。さらに、実際のデータ自体ではなく、データを表現する参照に動作を実行することにより、参照がデータ自体よりもよりコンパクトである(例えば、データの行を表す参照のセットは、その行を構成するデータ値よりも占める空間が小さい)ことから、さらなる効率化が実現されうる。さらに、上述のようなキャッシングと、後述のようなキャッシュの識別とを実行することにより、冗長性を避けることができ、ここで、例えば、既存のキャッシュされた結果が反復計算を避けるために利用されうる。
図13は、変換結果をキャッシュするための処理の一実施形態を示すフローチャートである。いくつかの実施形態において、処理1300は、図2のデータ変換エンジン210およびキャッシュエンジン212によって実行される。処理は、順序付けられたデータ準備動作のセットが1または複数のデータセットに実行された結果を表すデータトラバーサルプログラムが生成される工程1302で始まる。いくつかの実施形態において、順序付けられたデータ準備動作のセットは、入力データが通されるパイプラインを形成する。いくつかの実施形態において、データトラバーサルプログラムは、結果を引き出すために1または複数のデータセット内の1または複数の影響を受けた列を集める方法を示す。いくつかの実施形態において、1または複数のデータセットは、アドレス可能なデータセットとして再書き込みされる。例えば、1または複数のデータセットは、上述のように、列ファイルとして再書き込みされ、列ファイルは、ファイルに格納されたセルの列である。いくつかの実施形態において、列ファイルの値は、1または複数のデータセットのソースから取得される。動作が実行されると、列ファイルの新しいバージョンが、動作によって影響(例えば、修正/変更)を受けた列について書き込まれる。いくつかの実施形態において、順序付けられたデータ準備動作のセットは、(例えば、図2のスクリプトジェネレータ204によって生成された)スクリプトの形態で受信される。いくつかの実施形態において、スクリプトは、(例えば、ユーザインターフェースエンジン202によって提供された)ステップエディタユーザインターフェースを介して受信されたユーザ入力に基づいて生成される。ステップエディタユーザインターフェースは、ユーザが1または複数の入力データセットに実行される順序付けられたデータ準備動作のセットをするためのユーザインターフェースを提供する。
データトラバーサルプログラムは、順序付けられたデータ準備動作のセットを実行した累積的影響を記録する。いくつかの実施形態において、上述のように、データトラバーサルプログラムは、(例えば、参照テーブルに格納された)参照を含む。参照は、順序付けられたデータ準備動作のセット中に起こった行の変換のマッピングへの参照である。いくつかの実施形態において、参照は、結果内に行を記述/規定するために用いられる(例えば、列ファイル内の)データ値を参照する。いくつかの実施形態において、データトラバーサルプログラムは、参照スタックを含む。参照スタックは、順序付けられた動作の記録/履歴と、順序付けられた動作のセットによって変更された列とを含む。いくつかの実施形態において、参照スタックは、実行されたデータ準備動作により書き込まれたデータ値の列ファイルを格納するファイルセットへの参照を含む。
いくつかの実施形態において、データトラバーサルプログラムは、結果を格納するのに必要なよりも少ないストレージ/メモリを必要とする。いくつかの実施形態において、データトラバーサルプログラムは、データセットを移動させることなしに生成される。いくつかの実施形態において、データトラバーサルプログラムは、結果を生成することなしに生成される。
いくつかの実施形態において、データトラバーサルプログラムが順序付けられた動作のセットにわたって生成/更新される方法は、上記の様々なデータ準備動作の例において説明したように、動作依存である。データトラバーサルプログラムを生成および実行するための技術の例については、上記の例で説明されている。
工程1304で、結果を表すデータトラバーサルプログラムが格納される。例えば、データトラバーサルプログラムは、キャッシュ層にキャッシュされる。いくつかの実施形態では、データトラバーサルプログラムに関するデータ(参照テーブルなど)が格納される。いくつかの実施形態において、データトラバーサルプログラムを格納/キャッシュするか否かの決定は、様々な要素に基づきうる。例えば、ユーザは、順序付けられた動作のセットにおいて保存ポイントを作成したい場所を(例えば、エディタユーザインターフェースを介して)明示的に指示できる。次いで、その保存ポイントの位置に対応するキャッシュ表現が格納される。いくつかの実施形態において、データトラバーサルプログラムを格納するのではなく、データトラバーサルプログラムはメモリに維持される。
いくつかの実施形態において、表現をキャッシュするか否かの決定は、実行されたデータ動作に基づく。例えば、動作/動作セットの複雑性/計算コストが考慮されうる。一例として、セット全体に影響するソート、フィルタ、または、結合など、コストの掛かる/高価な動作については、結果として得られるデータトラバーサルプログラムは、キャッシュされうる。別の例として、集合的な動作のセットのコストが考慮されてもよい。例えば、大文字化の実行など、個々の動作のコストは高くない場合があるが、その動作を複数回実行すると(例えば、20列の大文字化を実行すると)、コストが掛かりうる。したがって、スクリプトの内容は、どこでキャッシングを実行すべきかを決定するために評価されうる。
考慮できる要素の別の例は、ユーザが動作を修正する可能性の大きさを含む。例えば、様々なユーザの行動を経時的に観察することにより、スクリプト内でしばしば変更またはスワップアウトされる動作のタイプを特定して学習することができる。
パイプラインの様々なステージで表現をキャッシュすることにより、ユーザは、例えば、パイプラインにおける特定の時点の結果を、その時点までに至る順序付けられた動作のセットを再計算することなしに、見直すことができる。
いくつかの実施形態において、データトラバーサルプログラムは、1または複数の対応するシグネチャのセットと共に格納される。いくつかの実施形態において、1または複数のシグネチャのセットは、実行された順序付けられた動作のセットに基づいて導出される。例えば、各シグネチャは、実行された動作のハッシュ関数(例えば、MD5、SHA−1、または、何らかのその他のシグネチャ生成関数などの暗号学的ハッシュ)を用いて生成され、ここで、動作は、適用された順序を保つように組み合わせられる。シグネチャについては、図14の処理1400に関して後に詳述する。
いくつかの実施形態において、結果を表すデータトラバーサルプログラムは、再計算および更新できる。例えば、ユーザがソースデータセットDSXに順序付けられた動作のセットを実行したと仮定する。次の朝、別のユーザがソースデータセットDSXの変更を行う。ソースデータセットDSXが変更された旨の示唆に応答して、データトラバーサルプログラムは、変更されたソースデータセットに順序付けられた動作のセットを再実行することによって更新されることができる(すなわち、新しいキャッシュが、より新しいバージョンのデータを用いて構築され、キャッシュの自動更新を可能にする)。
工程1306で、1または複数のデータセットに実行される順序付けられた動作のセットの仕様が受信される。工程1308で、結果を表すデータトラバーサルプログラムがアクセスされる。いくつかの実施形態では、結果を表すデータトラバーサルプログラムの格納済みのコピーがアクセスされる。いくつかの実施形態において、データトラバーサルプログラム(またはそのコピー)は、工程1306での仕様の受信に応答してアクセスされる。一例として、ユーザは、さらに、データトラバーサルプログラムの生成を引き起こすステップ以外のデータ準備ステップを実行する。ユーザは、生成されたデータトラバーサルプログラムが格納/キャッシュされたパイプライン内のステージに戻りたいと決定する。これは、ユーザが同じセットの順序付けられた動作を実行したいことを示唆する。次いで、キャッシュされたデータトラバーサルプログラムがリトリーブされる。
別の例として、別のユーザが、キャッシュされたデータトラバーサルプログラムを生成するために実行されたのと同じ(または等価な)セットの順序付けられたデータ準備を(例えば、ステップエディタユーザインターフェースを介して)偶然に構成する。シグネチャが、そのセットの順序付けられた動作の受信された仕様から導出される。シグネチャは、キャッシュされたデータトラバーサルプログラムのシグネチャと一致すると決定される。次いで、一致するキャッシュ済みのデータトラバーサルプログラムが取得される。キャッシュされた結果を取得するためのシグネチャの利用に関するさらなる詳細については、図14の処理1400に関して記載する。
工程1310で、1または複数のデータセット内の1または複数の影響を受けた列は、結果を生成するために、データトラバーサルプログラムに従って集められる。データトラバーサルプログラムを実行する例については、図7Bおよび図8Bに関して上述した。工程1312で、結果が出力される。いくつかの実施形態において、結果を出力する工程は、結果を発酵する工程または別のファイルへエクスポートする工程を含む。いくつかの実施形態において、結果を出力する工程は、結果を表示する工程を含む。いくつかの実施形態では、UIの現在のウィンドウで閲覧可能な結果だけが表示される。例えば、結果が1000の行を含むが、UIで閲覧可能であるのが300行だけである場合、それらの300行だけが、データトラバーサルプログラムを用いて集められる。(潜在的にユーザが結果をスクロールできるように、より多くの行が集められてよい)。いくつかの実施形態では、ユーザに見える行が、実行される計算の量を決定する。例えば、全データにデータ準備動作の実行するのではなく、動作は、ユーザに見える行にのみ実行される。一例として、どの行がユーザにとって可視であるか(例えば、どの行がユーザインターフェースで見られるのか)についての決定がなされる。データ準備動作は、ユーザが現在見ることのできる行を含む(参照する)パーティションにのみ実行される。これは、ユーザの望む結果を提供しつつ、計算負荷の量を削減する。
いくつかの実施形態において、上述のように、処理1300は、分散型計算環境(例えば、Spark分散型計算プラットフォーム)の文脈で実行され、ここで、処理される(データ準備動作のパイプライン/順序付けられたセットを通して変形される)1または複数のデータセットは、(例えば、上述のパイプラインエグゼキュータによって)処理されるように(例えば、図5に記載の処理500を用いて)パーティションに分割される。
いくつかの実施形態において、各パーティションは、独自のデータトラバーサルプログラムを含み、データトラバーサルプログラムは、実行されると、1または複数のデータセットに順序付けられたデータ準備動作のセットを適用した全体結果の一部を提供する。
データトラバーサルプログラムを用いてかかる分散型計算プラットフォーム内で結果を集めるために工程1310で実行された処理の実施形態の一例は、以下の通りである。パイプライン内の或るステージでの累積結果の一部が、パーティションにアクセスすることによって取得される。パーティションのためのデータトラバーサルプログラムが取得および実行される。結果の一部の行を表す参照のセットが、データトラバーサルプログラムの参照テーブルから取得される。各参照は、パーティション番号および行識別子を特定する座標を含む。座標は、以前に書き込まれたファイルセットを特定してアクセスするために、参照スタックのエントリと併せて用いられる。ファイルセットは、動作を実行した結果として変更された列のセットを含む。行識別子は、ファイルセットに書き込まれた列の指定された一部において行を特定するために用いられる。列の指定された一部に対するその行内の値が取得される。ルックアップされる列が、参照スタックエントリ内で指定される。したがって、1または複数のデータセット内の1または複数の影響を受けた列が、データトラバーサルプログラムに従って集められる。
パイプラインのそのステージ時点での全体結果は、(例えば、上述のように、パイプラインマスタにより)結果の異なる部分を集めて並べることによって決定され、ここで、パーティションから取得された結果の様々な部分は、特定の順序に(例えば、上述のように、パーティション順に)構造化される。
結果の異なる部分の位置の知識は、パイプラインマスタによって管理されうる。これは、出力の提供時に最適化を実行するために利用できる。例えば、UIでユーザにどの結果ウィンドウを提供するのかを決定する時に(例えば、結果をスクロールさせている時に)、全体結果におけるユーザの現在位置に対応する結果の部分のみが、それらに対応するパーティションから取得される。
図14は、キャッシュ再利用のための処理の一実施形態を示すフローチャートである。いくつかの実施形態において、処理1400は、図2のデータ変換エンジン210およびキャッシュエンジン212によって実行される。その処理は、第の順序付けられたデータ準備動作のセットが複数の変換結果を生成するために1または複数のデータセットに実行される工程1402で始まる。いくつかの実施形態において、データ準備動作は、入力データを変換/変化させる動作である。いくつかの実施形態において、データは、順序付けされた動作のセットの実行時に動的にアクセス可能であり、ここで、データは、必ずしも格納されておらず、必要に応じてオンザフライで計算されてもよい。これは、固定された既知の位置に格納されたデータに対する動作と対照的である。さらに、第1の順序付けられた動作のセットは、入力が予めインデックス化および分割されている利点なしに実行される。様々な実施形態において、データ準備動作は、クラスタリング、結合、付加、ソート、大文字化、小文字化、フィルタリング、重複排除、グループ分け、列の追加または除去、行の追加または除去、ピボッティング、デピボッティング、順序依存の動作などを含む。いくつかの実施形態において、複数の変換結果は、上記の例および図13の処理1300において記載したものなど、データトラバーサルプログラムを含む。
工程1404で、複数の変換結果の内の1または複数、ならびに、1または複数の対応する動作シグネチャがキャッシュされる。いくつかの実施形態において、キャッシュされる動作シグネチャは、対応する結果を生成した順序付けられた動作の一部に少なくとも部分的に基づいて導出される。シグネチャの一例は、順序付けられた動作の一部のハッシュである。いくつかの実施形態において、キャッシュされた動作シグネチャは、対応する結果に至るために実行された順序付けられた動作の一部の表現の順序に依存しないグルーピングを含む。例えば、シグネチャは、順序付けられた動作の一部を表す(ハッシュされた)識別子(例えば、シリアル番号、文字列表現など)のグルーピングである。いくつかの実施形態において、グルーピングは、順序に依存しうる。いくつかの実施形態において、動作表現のグルーピングに基づいたシグネチャを有することは、例えば、(例えば、順序付けられた動作の異なるセットで指定された)データ準備動作の異なるグループ間に任意の重複があるか否かを判定するために、動作表現のその他のグルーピングとの集合的な比較を行うことを可能にする。いくつかの実施形態において、キャッシュされる動作シグネチャは、処理されたデータセットへの参照に基づいても導出される。例えば、キャッシュされる動作シグネチャは、処理されるデータセットの識別子および/またはバージョン番号に基づいて生成されてもよい。いくつかの実施形態において、変換結果は、データトラバーサルプログラム(上述のものなど)を含む。
工程1406で、第2セットの順序付けられた動作の仕様が受信される。例えば、ユーザインターフェースを介して、ユーザは、新たな第2セットの順序付けられた動作を作成するか、または、既存のセットの順序付けられた動作を操作する。工程1408で、第2セットの順序付けられた動作に関連する動作シグネチャが決定される。
工程1410で、キャッシュ済みの結果の中の1つのキャッシュ済みの結果が、決定された動作シグネチャに少なくとも部分的に基づいて特定される。例えば、いくつかの実施形態において、決定された動作シグネチャは、格納された結果に対応するシグネチャと比較される。例えば、シグネチャに関連する動作表現のグルーピングは、決定された動作シグネチャの動作と、格納された結果に関連する動作との間の任意の重複(例えば、部分的または完全な重複)を決定するために、互いに集合的に比較されうる。
いくつかの実施形態において、シグネチャは、順序付けられた動作のセットのフローを表す図11J〜Kに示したようなグラフ構造に対応する。異なるシグネチャを比較することは、異なるグラフ構造を比較することを含む。いくつかの実施形態において、比較されたシグネチャのいずれかまたは全部が、一致するかまたは他の形で等価であるか否かが判定される(例えば、サブシグネチャが特定されうる)。いくつかの実施形態において、オペレータプッシュダウン(図11Kに関して上述したものなど)が、一致を見いだすために利用されてよい。いくつかの実施形態において、オペレータプッシュダウンは、機能的(意味的)に等価なシグネチャを生成する。したがって、第2セットの順序付けられた動作の一部に一致する格納された結果が、特定されて利用されうる。
工程1412で、キャッシュされた結果が出力される。いくつかの実施形態において、格納された結果が、第2セットの順序付けられた動作を実行した結果と等価である場合、特定された格納済みの結果が直接出力される(例えば、UIに表示されるか、または、発行/エクスポートされる)。いくつかの実施形態において、特定された格納済みの結果が、部分一致であり、所望の最終結果を取得するために利用できる中間結果である場合、結果のその部分は取得されるため、計算の必要はない。これは、第2セットの順序付けられた動作を実行するのに必要な計算の量を削減し、最終結果に到達するために、特定された格納済みの結果を組み込むことができる。
ステップエディタ
図15A〜Eは、データ準備動作のシーケンスを構成すると共に、対応する結果を閲覧するために利用できるステップエディタのユーザインターフェースの実施形態の例である。いくつかの実施形態において、図15A〜Eのユーザインターフェースの例は、図2のフロントエンド200のユーザインターフェースエンジン202によって実施される。
例えば、ユーザが、図15AのステップエディタUI1500を介して、順序付けられたデータ準備動作のセット1502を指定すると仮定する。順序付けられた動作のセットは、1504で始まり、ここで、データセット(この例では、「Transactions」と呼ぶ)が指定されている。いくつかの実施形態において、データセットは、上述の技術を用いて分割およびインポートされる。ステップ/アクションが実行される基準を指定するために、順序付けられた動作のセット内のステップを編集できる。例えば、ステップ1506では、構成可能なフィルタリング基準に基づいて、行を削除できる。いくつかの実施形態において、指定されたステップは、(例えば、図2のフロントエンド200のスクリプトジェネレータ204を用いて)スクリプトを生成するために用いられる。次いで、スクリプト内で指定された動作は、例えば、図2のパイプラインサーバ206および/または図3のパイプラインサーバ300によって実行される。
1508で、特定のステップの時点での結果を見ることができる。この例では、ステップ1504〜1506を順次実行した結果が示されている。結果は、上述の技術を用いて決定されてよく、例えば、結果を表すデータトラバーサルプログラムが生成される。次いで、データトラバーサルプログラムは、対応する結果を出力するために実行されうる。かかるデータトラバーサルプログラムを利用して、(実際のデータ自体に作用するのではなく)実際のデータセットの中間表現である参照に作用することにより、上述のように結果として得られる計算効率の上昇は、アプリケーション応答時間を改善することができ、ここで、例えば、動作が実行されるのに長時間ユーザが待つ必要なしに、結果がリアルタイムでユーザに提供される。いくつかの実施形態では、UIの部分1508に見ることのできる結果のみが、上述のように計算および表示される。1510で、特定のステップの時点での結果を発行(例えば、エクスポート)することもできる。
ステップエディタユーザインターフェースは、さらに、順序付けられたステップのセットを行き来する機能を提供する。図15Aの例に続いて、ユーザが、図Bの3番目のステップ1512に戻って、そのステップでのデータを見たいと仮定する。そのステップでの結果が(例えば、対応する保存ポイントで)以前にキャッシュされていた場合、キャッシュされた結果がリトリーブされて、表示領域1514に表示されうる。例えば、順序付けられた動作のセットが実行される時に、ステップ1512の時点での結果が、ユーザによって(例えば、パイプラインのそのステージに対応する「保存」ボタンを押すことにより)保存されるか、または、(例えば、上述のような様々なコスト関数および基準に基づいてパイプラインサーバ300などのパイプラインサーバによって)自動的に保存されうる。
いくつかの実施形態において、そのステップのための保存ポイントがなかった場合、利用できる任意の既存のキャッシュされた結果があるか否かが判定される。例えば、上述のように、動作シグネチャ(例えば、ハッシュ)が、対象となる現在のステップのセットに対して生成され、キャッシュ済みの結果に関連するシグネチャと比較されうる。一致が見られる場合、一致するキャッシュ済みの結果に到達するための計算を実行する必要がなくなるように、そのキャッシュ済みの結果が取得されうる。いくつかの実施形態では、最終結果を決定する途中の中間結果であるキャッシュされた結果を特定する一致が利用されてもよい。例えば、中間結果を再計算する必要がないため、所望の結果に到達するのに必要な計算の総量が削減される。一致が見いだされない場合、現在のステップのセットを実行して、所望の結果に到達することができる。
ユーザは、(例えば、以前に後退した後にパイプラインの或るポイントに戻るために)ステップを通して前進することもできる。上述したのと同様に、前方の結果が保存/キャッシュされている場合、それがリトリーブされ、出力として提供されうる。キャッシュされた結果が存在しない場合、結果が、(例えば、新しいデータトラバーサルプログラムを決定することによって)再計算されうる。
いくつかの実施形態において、ステップエディタは、或るステップがある場合およびない場合にデータがどのように見えるのかを知るために、そのステップをミュートする機能を提供する。図15Bの例に続いて、ユーザが、図15Cのインターフェース1516を介して、3番目のステップ1518(図15Bの3番目のステップ1512と同じ)をミュートしたいと示唆したと仮定する。いくつかの実施形態では、新しいスクリプトが、1518を含まないステップ1520に対して生成される。いくつかの実施形態において、削減されたステップセットの動作は、1または複数の動作シグネチャを生成するために用いられる。生成されたシグネチャは、任意の既存のキャッシュされた表現を利用できるか否かを判定するために用いることができる。利用できない場合、図15Bのステップ1512を除いた新しいセットの順序付けられたステップが再計算される。
実施形態の一例において、新しいセットの順序付けられたステップに基づいて生成されたシグネチャは、(1518がミュートされた)新しいセットの順序付けられたステップ1520のツリー/グラフ表現を作成するために用いられる。これは、キャッシュされた結果のシグネチャから生成されたツリー/グラフと比較される。図11J〜Kに関して記載されたのと同様の技術を用いれば、利用できる任意の既存のキャッシュされた結果が存在するか否かを判定することができる。例えば、オペレータプッシュダウンは、潜在的な一致を決定する時に利用できる。
次いで、ステップ1518をミュートした結果が、1519に示すように表示されうる。
いくつかの実施形態において、ステップエディタは、さらに、ステップを削除する機能を提供する。図15Cの例に続いて、ユーザが、ステップ1518をミュートしたデータを見た後に、そのステップを除去するよう決定すると仮定する。図15Dのインターフェース1522の部分1524は、そのステップの除去を反映するように更新される。
いくつかの実施形態において、ステップエディタは、さらに、順序付けられた動作のセットへの変更を保存する機能を提供する。例えば、パイプラインへの変更がなされると、パイプラインの各バージョンが、処理されるプロジェクトの異なるバージョンとして保存されうる。例えば、プロジェクトの異なるバージョンが、図15Eの1526に示されている。この例において、ユーザは、バージョン1528を見ようと選択した。プロジェクトのバージョン1528に対応するパイプラインは、1530に示されている。この例において、バージョン1528は、図15Cの時点でのプロジェクトの状態を保存することによって維持されたものであり、ここで、3番目のステップはミュートされている。プロジェクトのバージョン1528の結果は、1532に示されている。
図16は、データ準備にステップエディタを用いるための処理の一実施形態を示すフローチャートである。いくつかの実施形態において、処理1600は、図2のパイプラインサーバ206によって実行される。処理は、データセットに対する順序付けられたデータ準備動作のセットの少なくとも一部に関するユーザ入力の示唆が受信される工程1602で始まる。例えば、上述したようなユーザ入力(例えば、ステップのミュート、ステップの削除、順序付けられたデータ準備動作のセット内での後退/前進、など)が受信される。いくつかの実施形態において、ユーザ入力は、(例えば、ユーザインターフェースエンジン202を用いて)図2のフロントエンド200などのフロントエンドによって提供されたユーザインターフェース(例えば、上述のステップエディタユーザインターフェース15A〜Eなど)を介して受信される。いくつかの実施形態において、ユーザ入力は、順序付けられたデータ準備動作のセット内のデータ準備動作の少なくとも一部への変更または選択をもたらす。いくつかの実施形態では、スクリプトが、順序付けられたデータ準備動作のセットおよびユーザ入力に基づいて(例えば、図2のフロントエンド200のスクリプトジェネレータ204を用いて)生成される。いくつかの実施形態において、順序付けられたデータ準備動作のセットは、ユーザ入力値に応答して保存される。例えば、順序付けられたデータ準備動作のセットへの変更が検出された場合、新しいバージョンの順序付けられたデータ準備動作が保存される(例えば、上述のように、バージョンニングが実行される)。
工程1604で、順序付けられたデータ準備動作のセットおよびユーザ入力に少なくとも部分的に基づいて、シグネチャが生成される。例えば、ユーザが、(例えば、ステップのミュートまたは削除によって)順序付けられたデータ準備動作のセットを変更した場合、順序付けられたデータ準備動作の変更後のセットに基づいたシグネチャが生成される。別の例として、ユーザが、パイプライン内の或る特定のステージの時点での(例えば、5つの順序付けられたデータ準備動作のセットの内のステップ3の時点での)結果を見るために、順序付けられたデータ準備動作のセット内を移動(例えば、前進または後退)した場合、シグネチャが、ユーザによって示されたポイントまでの順序付けられたデータ準備動作の一部に対して生成されうる。いくつかの実施形態において、シグネチャは、順序付けられたデータ準備動作のセットに関してユーザ入力に応答して生成されたスクリプトに基づいて生成される。
いくつかの実施形態において、シグネチャは、処理中/処理予定のデータセットに基づいて生成される。例えば、データセットへの参照/データセットの表現が、シグネチャを生成するために用いられる。データセットの表現の一例は、データセットの識別子およびバージョン番号である。例えば、異なるデータセットは、異なる識別子に関連付けられうる。同じデータセットの異なるバージョンは、異なるバージョン番号に関連付けられうる。以下で詳述するように、シグネチャは、順序付けられたデータ準備動作のセット、順序付けられたデータ準備動作のセットに関するユーザ入力、および、データセットの表現に基づいてマッチングされうる。例えば、同じセットの順序付けられたデータ準備動作が、2つの異なるデータセットに適用されると、結果として、異なるシグネチャが生成される(同様に、異なる結果となる)。
工程1606で、生成されたシグネチャは、順序付けられたデータ準備動作のセット、ユーザ入力、および、データセットへの参照に関連するキャッシュ済みの結果が存在するか否かを判定するために用いられる。いくつかの実施形態において、一致判定およびキャッシュ済みの結果の特定は、図14の処理1400に関して記載された技術を用いて実行される。例えば、生成されたシグネチャは、(データトラバーサルプログラムによって表される)キャッシュ済みの結果に対応するシグネチャと比較される。部分一致も特定されうる。同様に、オペレーションプッシュダウンなど、上述の他の技術が、一致を特定するために用いられてもよい。関連するキャッシュ済みの結果が存在する場合、処理は工程1608へ続く。関連するキャッシュ済みの結果が存在しない場合、処理は工程1610へ続く。
工程1608で、キャッシュ済みの結果に関連するマッチングがリトリーブされる。いくつかの実施形態において、キャッシュされた結果は、データトラバーサルプログラムを用いて表現され、データトラバーサルプログラムがリトリーブされる。いくつかの実施形態において、キャッシュ済みの結果が、順序付けられたデータ準備動作のセットにユーザ入力を適用した結果と等価である場合、リトリーブされたキャッシュ済みの結果が、工程1612で直接出力される(例えば、ステップエディタUIに表示されるか、または、発行/エクスポートされる)。いくつかの実施形態において、特定されたキャッシュ済みの結果が、部分一致であり、所望の最終結果を取得するために利用できる中間結果である場合、結果のその部分は取得されるため、再計算の必要はない。これは、最終結果に到達するのに必要な計算の量を削減する。次いで、最終結果が、キャッシュされた結果に関連するリトリーブされたデータトラバーサルプログラムを用いて計算され、工程1612で出力されうる。
工程1610で、一致するキャッシュ済みの結果が存在しない場合、順序付けられたデータ準備動作のセットにユーザ入力を適用した結果を表すデータトラバーサルプログラムが、(例えば、図13の処理1300に関して上述した処理を用いて)生成される。次いで、生成されたデータトラバーサルプログラムによって表された結果は、工程1612で出力として提供される。例えば、結果は、発行されるか、または、(例えば、外部ファイルに)エクスポートされる。
いくつかの実施形態において、上述したようなステップエディタユーザインターフェースを介してユーザに結果が表示される。いくつかの実施形態では、UIの現在のウィンドウで閲覧可能な結果だけが表示される。例えば、結果が1000の行を含むが、UIで閲覧可能であるのが300行だけである場合、それらの300行だけが、データトラバーサルプログラムを用いて集められる。(潜在的にユーザが結果をスクロールできるように、より多くの行が含められてもよい)。
いくつかの実施形態では、ユーザに見える行が、実行される計算の量を削減するために利用されうる。例えば、全データにデータ準備動作の実行するのではなく、動作は、ユーザに見える行にのみ実行される。一例として、どの行がユーザにとって可視であるか(例えば、どの行がユーザインターフェースで見られるのか)についての決定がなされる。(潜在的にユーザが結果をスクロールできるように、より多くの行が含められてもよい)。データ準備動作は、ユーザが現在見ることのできる行を含む(参照する)パーティションにのみ実行される。これは、ユーザの望む結果を提供しつつ、計算負荷の量を削減する。したがって、ユーザに見える行にのみ動作を実行することにより、ユーザは、ステップエディタユーザインターフェースと相互作用する時に(例えば、データ準備動作を変更する時に)、リアルタイムの結果を見ることができる。
上述の実施形態は、理解しやすいようにいくぶん詳しく説明されているが、本発明は、提供された詳細事項に限定されるものではない。本発明を実施する多くの代替方法が存在する。開示された実施形態は、例示であり、限定を意図するものではない。
適用例1:システムであって、
プロセッサであって、
1または複数のデータセットに実行された順序付けられたデータ準備動作のセットの結果を表すデータトラバーサルプログラムを生成し、前記データトラバーサルプログラムは、前記結果を導出するために、前記1または複数のデータセット内の1または複数の影響を受けた列をどのように集めるのかを示し、
前記1または複数のデータセットに実行される前記順序付けられた動作のセットの仕様を受信したことに応答して、前記結果を表す前記データトラバーサルプログラムまたは前記結果を表す前記データトラバーサルプログラムの格納済みのコピーにアクセスし、
前記結果を再生成するために、前記データトラバーサルプログラムに従って、前記1または複数のデータセット内の前記1または複数の影響を受けた列を集め、
前記結果を出力するよう構成されているプロセッサと、
前記プロセッサに接続され、前記プロセッサに命令を提供するよう構成されているメモリと、
を備える、システム。
適用例2:適用例1に記載のシステムであって、データ準備動作は、データセットを変換する動作を含む、システム。
適用例3:適用例1に記載のシステムであって、前記データトラバーサルプログラムは、前記結果の行を記述するために用いられる列値への参照を含む、システム。
適用例4:適用例1に記載のシステムであって、前記データトラバーサルプログラムは、参照スタックを含み、前記参照スタックは、前記順序付けられた動作の記録と、前記順序付けられた動作によって影響を受けた列とを含む、システム。
適用例5:適用例1に記載のシステムであって、前記データトラバーサルプログラムは、前記結果自体よりも、必要とするメモリストレージの量が少ない、システム。
適用例6:適用例1に記載のシステムであって、前記データトラバーサルプログラムを生成することは、前記1または複数のデータセットを複製しない、システム。
適用例7:適用例1に記載のシステムであって、前記データトラバーサルプログラムに関するデータは自動的に格納される、システム。
適用例8:適用例1に記載のシステムであって、前記データトラバーサルプログラムに関するデータは前記順序付けられたデータ準備動作のセットの複雑性に基づいて格納される、システム。
適用例9:適用例1に記載のシステムであって、前記データトラバーサルプログラムに関するデータは、前記結果を格納する要求に応答して格納される、システム。
適用例10:適用例1に記載のシステムであって、前記出力された結果の少なくとも一部は、ウィンドウビューに表示される、システム。
適用例11:適用例1に記載のシステムであって、前記データトラバーサルプログラムは、1または複数のシグネチャのセットに関連付けられる、システム。
適用例12:適用例11に記載のシステムであって、前記1または複数のシグネチャのセット内の各シグネチャは、ハッシュ関数を用いて生成される、システム。
適用例13:適用例1に記載のシステムであって、データセットは、1または複数の列を含む、システム。
適用例14:方法であって、
1または複数のデータセットに実行された順序付けられたデータ準備動作のセットの結果を表すデータトラバーサルプログラムを生成し、前記データトラバーサルプログラムは、前記結果を導出するために、前記1または複数のデータセット内の1または複数の影響を受けた列をどのように集めるのかを示し、
前記1または複数のデータセットに実行されるセットの順序付けられた動作のセットの仕様を受信したことに応答して、前記結果を表す前記データトラバーサルプログラムまたは前記結果を表す前記データトラバーサルプログラムの格納済みのコピーにアクセスし、
前記結果を再生成するために、前記データトラバーサルプログラムに従って、前記1または複数のデータセット内の前記1または複数の影響を受けた列を集め、
前記結果を出力すること、
を備える、方法。
適用例15:適用例14に記載の方法であって、データ準備動作は、データセットを変換する動作を含む、方法。
適用例16:適用例14に記載の方法であって、前記データトラバーサルプログラムは、前記結果の行を記述するために用いられる列値への参照を含む、方法。
適用例17:適用例14に記載の方法であって、前記データトラバーサルプログラムは、参照スタックを含み、前記参照スタックは、前記順序付けられた動作の記録と、前記順序付けられた動作によって影響を受けた列とを含む、方法。
適用例18:適用例14に記載の方法であって、前記データトラバーサルプログラムは、前記結果自体よりも、必要とするメモリストレージの量が少ない、方法。
適用例19:適用例14に記載の方法であって、データセットは、1または複数の列を含む、方法。
適用例20:コンピュータプログラム製品であって、持続性のコンピュータ読み取り可能な記憶媒体内に具現化され、
1または複数のデータセットに実行された順序付けられたデータ準備動作のセットの結果を表すデータトラバーサルプログラムを生成するためのコンピュータ命令と、前記データトラバーサルプログラムは、前記結果を導出するために、前記1または複数のデータセット内の1または複数の影響を受けた列をどのように集めるのかを示し、
前記1または複数のデータセットに実行されるセットの順序付けられた動作のセットの仕様を受信したことに応答して、前記結果を表す前記データトラバーサルプログラムまたは前記結果を表す前記データトラバーサルプログラムの格納済みのコピーにアクセスするためのコンピュータ命令と、
前記結果を再生成するために、前記データトラバーサルプログラムに従って、前記1または複数のデータセット内の前記1または複数の影響を受けた列を集めるためのコンピュータ命令と、
前記結果を出力するためのコンピュータ命令と、
を備える、コンピュータプログラム製品。