注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

データとの対話

Code Workspaces を使うと、Foundry データセットの読み込み、探索、解析、変換、書き戻しができます。

Code Workspacesでは、ワークスペース内で参照されるすべての Foundry データセットに対して、データセットエイリアス を選択する必要があります。データセットエイリアスは、特定のデータセットブランチへの参照として機能し、コード内でデータセットを読み込んだり書き込んだりできるようになります。

Data タブでデータセットを登録すると、Code Workspaces は、選択したデータセットエイリアスと Foundry データセットの一意の識別子との間にマッピングを作成し、ワークスペースの /home/user/repo/.foundry フォルダー内にある隠しファイルに保存します。

データセットのブランチ

デフォルトでは、Code Workspaces はワークスペース自体と同じブランチからデータセットのデータをロードし、それ以外の場合は master ブランチにフォールバックします。例えば、現在 my-branch にあるコードワークスペースは、データセットの my-branch バージョンを読み込もうとし、データセットに my-branch が存在しない場合は master ブランチにフォールバックします。

データのインポート

Code Workspaces では、Foundry の表形式および非表形式のデータセットをロードできます。

新しいデータセットは、Data タブの Import Dataset ボタンを使ってコードワークスペースに登録できます。

希望するデータセットを選択した後、表形式または非表形式のデータセットを選択し、必要に応じてワークスペース内のデータセットエイリアスを変更できます。Code Workspaces は、これらの設定を使用して、データセットを適切にロードするコードスニペットを生成します。

  • これらの設定は、データセットを登録した後でもいつでも変更できます。
  • デフォルトでは、Code Workspaces は、データセット自体と同じ名前のデータセットエイリアスを提案します。

データセットエイリアスが設定されたら、Copy and register dataset を選択してワークスペースにデータセットを登録し、コードスニペットをクリップボードに保存します。

最後に、ワークスペースにコードスニペットを貼り付け、コードを実行してデータセットをメモリにロードします。

例のコードスニペット

このページでは、表形式のデータセット非表形式のデータセットの例を提供しています。

表形式のデータセット

以下のスニペットは、データセットエイリアスが kittensCats 表形式データセットに対して生成されます。コードスニペット内で "Cats" はどこにも参照されていません。Copy and register dataset を選択した後、Code Workspaces は選択したデータセットエイリアスの下で暗黙的に登録します。

Jupyter® の場合:

Copied!
1 2 3 4 5 6 7 8 9 # foundry.transformsからDatasetをインポートします from foundry.transforms import Dataset # "kittens"という名前のデータセットを取得し、 # Arrow形式でテーブルを読み込み、 # pandasのデータフレームに変換します kittens = Dataset.get("kittens")\ .read_table(format="arrow")\ .to_pandas()

RStudio®で:

Copied!
1 2 # 子猫のデータセットを読み込む kittens <- datasets.read_table("kittens")

上記の構文はデータセットをロードし、自動的にデータをRのデータフレームに集めます。

データがワークスペースのメモリ容量を超える場合、以下の構文を使用して、行または列のサブセットのみをロードするためにプッシュダウンフィルターを適用できます。

Copied!
1 2 3 4 5 library(dplyr) # .Rprofile でデフォルトでインポートされるべきです kittens_df <- Dataset.get("kittens") %>% # (オプション) 収集する前に他の変換を適用する collect()

非表形式のデータセット

以下のスニペットは、データセットエイリアスが puppies の非表形式のデータセット Dogs に対して生成されます。コードスニペットでは Dogs はどこにも参照されていません。これは、Code Workspacesが データセットをコピーして登録する を選択した後、ユーザーの選択した名前でそれを暗黙的に登録するからです。表形式のデータセットとは異なり、これにより、データフレーム内に値を挿入するのではなく、puppies_files 変数を使ってデータセットのファイルにアクセスできます。

Jupyter®では:

Copied!
1 2 3 4 5 6 7 8 # foundry.transformsからDatasetをインポート from foundry.transforms import Dataset # "puppies"という名前のデータセットを取得 puppies = Dataset.get("puppies") # データセット内のファイルをダウンロード puppies_files = puppies.files().download()

RStudio®で:

Copied!
1 2 3 4 # "puppies"というデータセットのファイルリストを取得します。 puppies_files <- datasets.list_files("puppies") # "puppies"データセットのファイルをダウンロードし、ローカルのファイルリストに保存します。 puppies_local_files <- datasets.download_files("puppies", puppies_files)

セキュリティ

Code Workspacesでは、データセットに適用されたデータセキュリティマーキングが尊重されます。さらに、ワークスペースはロードしたすべてのデータセットのマーキングを継承します。これは、コードワークスペースにアクセスするためには、ワークスペース内に含まれるすべてのデータセットとその他の入力に対して必要な権限もユーザーが持っていなければならないことを意味します。ワークスペースの単一の入力に対するアクセスを失うと、ワークスペース全体へのアクセスを失います。

データセットのサイズ制限

Foundryの他のツールとは異なり、Code WorkspacesはデフォルトではSpark上で実行されません。Code Workspacesは、非常に大きなデータセットを扱うためではなく、素早い探索的な分析のために設計されました。メモリやCPUの制限に関連する問題を防ぐために、データセットをロードする前にフィルター処理するを使用してデータセットのサイズを縮小することを検討してください。

データをフィルター処理する

Code Workspacesでは、データセットをメモリにロードする前にフィルターを適用することができます。これにより、ワークスペースにインポートされるデータフレームのメモリ消費を効果的に削減し、分析に必要なデータサブセットに焦点を当てることができます。Code Workspacesは、行、列、またはその両方の選択に対応できる柔軟性を提供します。

フィルターを使用するタイミング

データセットのサイズ制限で説明したように、Code Workspacesは、非常に大きなデータセットを扱うよりも、迅速な探索と反復サイクルに最適です。ワークスペースにデータをロードする方法を決定する際に、以下のガイドラインを推奨します:

  • ワークスペースのメモリ内に収まる未圧縮データの場合、最大の効率を得るために、フィルターなしでデータセットをロードし、データ変換をメモリ内で適用することを推奨します。

  • 未圧縮データがワークスペースのメモリ容量を超える場合、のフィルターを使用して、データのサブセットをメモリにロードすることを推奨します。これらの押し下げフィルターは、データがワークスペースのメモリにロードされる前に適用され、インポートされたデータのメモリフットプリントを削減します。

  • 同じデータのサブセットを頻繁にロードする、またはそれを複数のワークスペースで使用する場合、そのサブセットを自身のデータセットとして保存することを推奨します。これにより、フィルターなしでサブセットをロードできます。データセットのパーケットファイルは一度だけダウンロードされますが、フィルタリングのオーバーヘッドは、データがワークスペースにロードされるたびに発生します。

  • より複雑なデータロード要件の場合、非タブラー型データセット構文を使用してデータセットをバックアップするファイルをダウンロードし、ネイティブの python または R パッケージを使用してファイルの内容を処理できます。

列フィルター

すべてのタブラー型データセットは、列のサブセットとともにワークスペースにロードすることができます。以下のデータセットを例に考えてみてください:

nameweightcoloragebreed
Bella60Brown4Labrador
Max75Black7German Shepherd
Daisy30White2Poodle

このデータセットを breedage の列だけでロードしたい場合は、以下の構文を使用します。ここでは dogs データセットが正しくワークスペースに登録されていると仮定します:

Jupyter®では:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 from foundry.transforms import Dataset, Column # "breed" と "age" の列だけを読み込む columns_to_load = ["breed", "age"] breed_and_age_only = Dataset.get("dogs")\ .read_table(format="arrow", columns=columns_to_load)\ .to_pandas() # "weight" と "color" の列だけを読み込む weight_and_color_only = Dataset.get("dogs")\ .read_table(format="arrow", columns=["weight", "color"])\ .to_pandas()

RStudio®で:

Copied!
1 2 3 4 5 6 # "breed" と "age" 列のみを読み込む columns_to_load <- c("breed", "age") breed_and_age_only <- datasets.read_table("dogs", columns=columns_to_load) # "weight" と "color" 列のみを読み込む weight_and_color_only <- datasets.read_table("dogs", columns=c("weight", "color"))

また、行フィルター処理する構文を使用して同じ結果を得ることもできます。

Copied!
1 2 3 4 5 6 library(dplyr) # .Rprofileでデフォルトでインポートされるべきです # "weight" と "color" 列のみをロードします weight_and_color_only <- Dataset.get("dogs") %>% select(weight, color) %>% collect()

行フィルター処理

この機能はデフォルトでは有効になっていません。詳細は Palantir の担当者にお問い合わせください。

タブラー形式のデータセットは、特定の条件を満たす行のサブセットを含むワークスペースにも読み込むことができます。

行フィルター処理は、Parquet 形式のデータセットにのみ適用可能です。CSV などの他の形式では、行フィルター処理 が可能ですが、行フィルター処理はできません。Foundry の変換機能を利用することで、ほとんどのタブラー形式のデータセットを簡単に Parquet 形式に変換できます。

前述の dogs データセットを思い出してください。

nameweightcoloragebreed
Bella60Brown4Labrador
Max75Black7German Shepherd
Daisy30White2Poodle
Buddy65Yellow3Labrador
Gizmo18Brown1Pug

Jupyter® での行フィルター処理の構文

以下の構文は、Jupyter® でデータセットを行レベルでフィルター処理するために使用できます。

dogs データセットから茶色の犬だけを読み込む場合、以下の構文を使用します。

Copied!
1 2 3 4 5 6 7 from foundry.transforms import Dataset, Column # 色が "Brown" の犬だけをロードする brown_dogs = Dataset.get("dogs")\ .where(Column.get("color") == "Brown")\ .read_table(format="arrow")\ .to_pandas()

.where.limit の使用に注目してください。これらは、データセットがワークスペースに読み込まれる前に、事前にデータセットをフィルター処理するために使用されます。.where ステートメントは、複数の条件を一度に適用するために連鎖させることができます:

Copied!
1 2 3 4 5 6 # 色が「ブラウン」で品種が「ラブラドール」の犬だけを読み込む golden_dogs = Dataset.get("dogs")\ .where(Column.get("color") == "Brown")\ .where(Column.get("breed") == "Labrador")\ .read_table(format="arrow")\ .to_pandas()

以下では、Jupyter® Code Workspacesでサポートされている、行フィルター処理するの適切な構文の例をいくつかご紹介します:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 # 特定の値に等しい行のみを保持 .where(Column.get("column_name") == value) # 特定の値に等しい行だけを保持 # 特定の値に等しくない行のみを保持 .where(Column.get("column_name") != value) # 特定の値に等しくない行だけを保持 # ~演算子を使った不等式 .where(~Column.get("column_name") == value) # 特定の値に等しくない行だけを保持 # 値が比較可能な他の値と比較して行を保持 .where(Column.get("column_name") > value) # 特定の値より大きい行だけを保持 .where(Column.get("column_name") >= value) # 特定の値以上の行だけを保持 .where(Column.get("column_name") < value) # 特定の値より小さい行だけを保持 .where(Column.get("column_name") <= value) # 特定の値以下の行だけを保持 # OR / AND 演算子 .where((Column.get("column_name") == value1) | (Column.get("column_name") == value2)) # 値がvalue1またはvalue2である行だけを保持 .where((Column.get("column_name1") == value1) & (Column.get("column_name2") == value2)) # 値がvalue1であるcolumn_name1と値がvalue2であるcolumn_name2の行だけを保持 # 値がnullでない行のみを保持 .where(~Column.get("column_name").isnull()) # 値がnullでない行だけを保持 # 値が指定されたリストに含まれる行のみを保持 .where(Column.get("column_name").isin([value1, value2, value3])) # 値がvalue1, value2, value3のいずれかである行だけを保持 # 日付が指定された範囲内にある行のみを保持 .where(Column.get("date_column_name").between('lower_bound_incl', 'upper_bound_incl')) # 日付がlower_bound_inclからupper_bound_inclまでの範囲内にある行だけを保持 # 最初のN行のみを保持(Nは数字) .limit(N) # 最初のN行だけを保持

RStudio® での行フィルター処理の構文

以下の構文を使用して、RStudio® でデータセットを行レベルでフィルター処理することができます。

Rstudio のフィルター処理は、 dplyr ライブラリの使用を通じて実装され、標準的なメソッド filterselect、そして head を実装します。これらのフィルター処理は 下方に押し出されます、これはフィルター処理がワークスペースのメモリにデータがロードされる前に適用されることを意味します。

以下の構文を使用して、 dogs データセットから茶色の犬だけをロードできます:

Copied!
1 2 3 4 5 6 library(dplyr) # .Rprofile でデフォルトでインポートされるべきです # 色が "Brown"(茶色)の犬だけをロードします brown_dogs <- Dataset.get("dogs") %>% foundry::filter(color == "Brown") %>% # 色が "Brown" の犬のみフィルタリング collect() # 結果を収集

foundry::filter を使用して、データセットをワークスペースにロードする前に事前にフィルター処理することに注意してください。技術的には、 foundry:: プレフィックスは必須ではありませんが、環境内の他のパッケージからの同様に名前付けられた filter 関数との潜在的な競合を避けるために、これを使用することをお勧めします。これらの filter ステートメントは、 dplyr ライブラリの %>% オペレーターを使用して、一度に複数の条件を適用するために連鎖させることができます。このライブラリは、ユーザーの RStudio ワークスペースの .Rprofile ファイルでデフォルトでインポートされる必要があります。

Copied!
1 2 3 4 5 6 7 library(dplyr) # .Rprofileでデフォルトでインポートされるべき # 色が"ブラウン"で、品種が"ラブラドール"の犬だけをロードします brown_labradors <- Dataset.get("dogs") %>% foundry::filter(color == "Brown") %>% foundry::filter(breed == "Labrador") %>% collect()

望ましいフィルター処理する内容を反復処理する際に、ワークスペースに大量のデータをロードするのを避けるため、クエリの一部として head ステートメントを含めることを推奨します。これにより含まれる行の数が制限されます:

Copied!
1 2 3 4 5 6 7 library(dplyr) # .Rprofileでデフォルトでインポートされるべき # 色が"Black"(黒)の犬だけを読み込み、最大1000行を返す black_dogs <- Dataset.get("dogs") %>% foundry::filter(color == "Black") %>% # 色が黒の犬だけをフィルタリング head(1000) %>% # 十分なフィルタを適用した後、コメントアウトまたは削除できます collect()

以下では、RStudio® Code Workspacesでサポートされている、行フィルター処理する構文の他の例をご紹介します。 列名は、引用符で囲まずに foundry::filter 関数に渡す必要があります。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 # ある特定の値と等しい行のみを保持する foundry::filter(column_name == "string_value") %>% foundry::filter(integer_column_name == 4) %>% # ある特定の値と等しくない行のみを保持する foundry::filter(column_name != value) %>% # ! 演算子を使用した不等式 foundry::filter(!(column_name == value)) %>% # 他の値と比較可能な値を持つ行のみを保持する foundry::filter(column_name > value) %>% foundry::filter(column_name >= value) %>% foundry::filter(column_name < value) %>% foundry::filter(column_name <= value) %>% # OR / AND 演算子 foundry::filter(column_name == value1 | column_name == value2) %>% foundry::filter(column_name == value1 & column_name == value2) %>% # 与えられたリストの一部である値を持つ行のみを保持する foundry::filter(column_name %in% c("value1", "value2")) %>% # 値が二つの指定された包括的な範囲内にある行のみを保持する foundry::filter(between(age, 2, 4)) %>% # 特定の列の部分集合を選択する select(column_name1, column_name2) %>% # セットされていれば、`filter`節で使用されるすべての列を含む必要があります # 最初のN行のみを保持する、Nは数字 head(N) %>%

さらに、Arrowテーブルとしてデータを一時的に収集することで、group_byのような高度なデータ変換を実行できます:

Copied!
1 2 3 4 5 6 7 8 9 library(dplyr) # .Rprofileでデフォルトでインポートされるべき grouped_dogs <- Dataset.get("alias") %>% # シンプルなフィルタは押し下げることができます foundry::filter(age > 2) %>% collect(as_data_frame = FALSE) %>% # 一時的にデータをArrowテーブルとして収集します # 高度な変換はarrowテーブルに適用する必要があります group_by(breed) %>% collect()

行と列のフィルター処理を組み合わせる

行のフィルター処理と列のフィルター処理を組み合わせて、列の一部と行の一部の両方を持つデータセットを読み込むことができます。先ほどの dogs データセットを使用して:

nameweightcoloragebreed
Bella60Brown4Labrador
Max75Black7German Shepherd
Daisy30White2Poodle
Buddy65Yellow3Labrador
Gizmo18Brown1Pug

以下の構文は、指定された重さを超える茶色の犬の名前、品種、および色を持つデータセットを取得するために使用できます。

Jupyter® で:

Copied!
1 2 3 4 5 6 7 # 色が「ブラウン」で重さが62以上の犬だけをロードします # カラムは「名前」、「品種」、「色」だけをロードします heavy_brown_dogs = Dataset.get("dogs")\ .where(Column.get("weight") > 62)\ # 重さが62以上の犬をフィルタリングします .where(Column.get("color") == "Brown")\ # 色がブラウンの犬をフィルタリングします .read_table(format="arrow", columns=["name", "breed", "color"])\ # 指定したカラムだけを読み込みます .to_pandas() # pandasのデータフレームに変換します

RStudio®で:

Copied!
1 2 3 4 5 6 7 8 9 library(dplyr) # .Rprofileでデフォルトでインポートされるべきです # 色が "Brown" で、重さが 62 を超える犬のみをロードします # "name"、"breed"、"color" の列のみをロードします heavy_brown_dogs <- Dataset.get("dogs") %>% foundry::filter(weight > 62) %>% # 重さが62以上の犬をフィルタリング foundry::filter(color == "Brown") %>% # 色がブラウンの犬をフィルタリング select("name", "breed", "color") %>% # 必要な列を選択 collect() # 結果を収集

データの書き込み

現在、インクリメンタルな書き込みはサポートされていません。つまり、データセットに書き込むと、既存のデータセットは全て上書きされます。

以下の手順に従って、Code Workspaces を使用して Foundry データセットに対話的に書き込むことができます。

  1. Data タブを開き、Import Dataset の右側にある Save to dataset オプションを選択して、ターゲットの出力データセットを作成します。
  2. 出力データセットの名前と、データセットを保存する場所を選択します。
  3. Save を選択します。
  4. 新しいデータセットが Data タブに表示されます。デフォルトでは、Save to dataset オプションが選択されており、出力データセットにはそのままにしておく必要があります。
  5. データセットのエイリアスも指定するように求められます。これは、データのインポート でのエイリアスの作り方と同様に、ワークスペース内での出力データセットの名前になります。
    • テーブル形式の出力データセットの場合、データセットにデータを供給するデータフレーム変数を指定するように求められます。
    • テーブル形式でないデータセットの場合、代わりにローカルのファイルまたはフォルダーのパスを指定して、データセットにアップロードする必要があります。
  6. データセットのタイプ、データセットのエイリアス、データフレーム変数が設定されたら、Copy and register dataset を選択してデータセットをワークスペースに登録します。これにより、コードスニペットもクリップボードに保存されます。
  7. ワークスペースにコードスニペットを貼り付け、必要に応じて変数を置き換え、コードを実行して出力データセットに書き込みます。

コードスニペットの例

上記の指示に従って、output_dataset_tabularoutput_dataset_non_tabular という名前の2つのデータセットが作成され、同名の変数が使われてワークスペースに登録されたと仮定します。Code Workspaces は、選択した変数に基づいて、各データセットに対して以下のコードスニペットを生成します:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 # tabular snippet from foundry.transforms import Dataset output_dataset_tabular = Dataset.get("output_dataset_tabular") # df_variableというデータフレームをテーブルとして書き込む output_dataset_tabular.write_table(df_variable) # non-tabular snippet from foundry.transforms import Dataset output_dataset_non_tabular = Dataset.get("output_dataset_non_tabular") # path_to_file_variableというファイルパスを使ってファイルを書き込む output_dataset_non_tabular.upload_directory(path_to_file_variable)
Copied!
1 2 3 4 5 6 7 # tabularスニペット # テーブル形式のデータを出力として書き込みます datasets.write_table(df_variable, "output_dataset_tabular") # non-tabularスニペット # テーブル形式でないデータファイルをアップロードします datasets.upload_files(path_to_file_variable, "output_dataset_non_tabular")