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

非構造化ファイルへのアクセス

定義済みの表形式スキーマを持つ Foundry データセットでの操作に加えて、Code Workbook はデータセット内の非構造化ファイルにアクセスすることもサポートしています。これは、画像やその他のメディア、XML や JSON などの半構造化フォーマット、GZ や ZIP ファイルなどの圧縮フォーマット、RDA や RDS などの R データフォーマットといった非構造化データの分析や変換に役立ちます。

Python での非構造化ファイル

ファイルの読み込み

Python トランスフォームでファイルを読み込むには、上流データセットを Python transform input として読み込みます。この API は、Foundry データセット内のファイルのパスに基づいてファイルアクセスを可能にする FileSystem オブジェクトを公開しており、基本的なストレージを抽象化しています。FileSystem についての詳細はこちら。 また、ブランチや RID などの他の情報も(トランスフォーム入力ドキュメントで詳述されているように)公開されています。

入力ヘルパーバーまたは入力タブで、入力のタイプを変更してください。

インポートされたデータセットと永続化されたデータセットのみが Python トランスフォーム入力として読み込まれます。データセットとして保存されていないトランスフォームは、Python トランスフォーム入力として読み込むことができません。

スキーマがないデータセットは、自動的にトランスフォーム入力として読み込まれる必要があります。

python-transform-input

例:ZIP ファイル内の CSV の読み込み

たとえば、次のコードは ZIP ファイル内の CSV を読み込み、CSV の内容をデータフレームとして返します。

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 import tempfile import zipfile import shutil import io from pyspark.sql import Row # datasetOfZippedFilesは、同じスキーマ(["id", "name"])を持つ3つのCSVファイルが含まれた1つの圧縮ファイルのデータセットです。 def sample(datasetOfZippedFiles): df = datasetOfZippedFiles fs = df.filesystem() # これはFileSystemオブジェクトです。 MyRow = Row("id", "name") # ファイルを処理する関数 def process_file(file_status): with fs.open(file_status.path, 'rb') as f: with tempfile.NamedTemporaryFile() as tmp: shutil.copyfileobj(f, tmp) tmp.flush() with zipfile.ZipFile(tmp) as archive: for filename in archive.namelist(): with archive.open(filename) as f2: br = io.BufferedReader(f2) tw = io.TextIOWrapper(br) tw.readline() # 各CSVの最初の行をスキップします for line in tw: yield MyRow(*line.split(",")) rdd = fs.files().rdd rdd = rdd.flatMap(process_file) df = rdd.toDF() return df

ファイルの書き込み

出力FileSystemに書き込むことが可能です。これは、画像、PDF、テキストファイルなどの非表形式のデータ形式を書き込むのに役立ちます。

Transforms.get_output()を呼び出してTransformOutputをインスタンス化します。TransformOutput APIについて詳しく学ぶ。

TransformOutputを使用してファイルを書き込むことは、データセットとして保存されたノードでのみ可能です。コンソールでTransformOutputを使用してファイルを書き込むことはできません。

TransformOutputをインスタンス化し、filesystem()や他のメソッドを呼び出して使用した後、TransformOutputオブジェクト以外の何ものも返すことは無視されます。

例:テキストファイルまたはデータセットの書き込み

次のコードは、テキストファイルを書き込む方法の例です:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 def write_text_file(): # Transformsから出力を取得 output = Transforms.get_output() # 出力のファイルシステムを取得 output_fs = output.filesystem() # 'my text file.txt'という名前でテキストファイルを開き、書き込みモードで開く with output_fs.open('my text file.txt', 'w') as f: # ファイルに"Hello world"と書き込む f.write("Hello world") # ファイルを閉じる f.close()

次のコードは、データセットを書き込み、パーティショニングと出力形式を指定する方法の例です。

Copied!
1 2 3 4 5 def write_dataset(input_dataset): # Transformsから出力を取得 output = Transforms.get_output() # データフレームを書き出す。パーティション列はcolAとcolB、出力形式はcsv output.write_dataframe(input_dataset, partition_cols = ["colA", "colB"], output_format = 'csv')

R での非構造化ファイル

ファイルの読み込み

R トランスフォームでファイルを読み込むには、上流のデータセットを R トランスフォーム入力 として読み込みます。TransformInput オブジェクトが公開されており、Foundry データセット内のファイルのパスに基づいてファイルへのアクセスが可能になります。FileSystem API について詳しくはこちら。

入力ヘルパーバーまたは入力タブで、入力のタイプを変更します。

R トランスフォーム入力として読み込むことができるのは、インポートされたデータセットと永続化されたデータセットのみです。データセットとして保存されていないトランスフォームは、R トランスフォーム入力として読み込むことはできません。

デフォルトでは、スキーマがないデータセットは、R トランスフォーム入力タイプにすでに設定されているはずです。

select-r-transform-input

例: RDS の読み込み

以下のコードを使用して、インポートされたデータセット内のファイルである RDS を読み込みます。RDS には、R data.frame が含まれています。

Copied!
1 2 3 4 5 6 7 8 9 RDS_reader <- function(RDS_dataset) { fs <- RDS_dataset$fileSystem() ## ファイルの名前は test_loading_RDS.rds です path <- fs$get_path("test_loading_RDS.rds", 'r') rds <- readRDS(path) return(rds) }

このコードは、RDSデータセットを読み込むための関数を定義しています。関数名は "RDS_reader" で、引数には RDSデータセットが必要です。まず、データセットのファイルシステムを取得します。次に、 "test_loading_RDS.rds" という名前のファイルへのパスを取得します。最後に、readRDS関数を使用してRDSファイルを読み込み、その結果を返します。

例: セットに含まれるZIP圧縮されたCSVの内容をrbindで使用する

以下のコードを使用して、セットに含まれるZIP圧縮されたCSVの内容をrbindします。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 result <- function(zip_file_with_csvs) { fs <- zip_file_with_csvs$fileSystem() ## zipファイルのリモートパス(名前)を取得 zipfile_name <- fs$ls()[[1]]$path ## zipファイルのローカルパスを取得 path <- fs$get_path(zipfile_name, 'r') # zipファイルに含まれるファイルをリスト化 zipped_files <- as.list(unzip(path, list = TRUE)$Name) # リストの各要素に対して、データフレームを返す list_of_data_frames <- lapply(zipped_files, function(x){read.csv(unz(path, x), header = TRUE, sep = ",")}) # すべてのデータフレームを束ねる rbind_df <- do.call(rbind,list_of_data_frames) return(rbind_df) }

ファイルの書き込み

出力FileSystemに書き込むことが可能です。これは、画像、PDF、テキストファイルなどの非表形式のデータフォーマットを書き込む際に便利です。

new.output()を呼び出して、TransformOutputをインスタンス化します。FileSystem APIについて詳しくはこちらをご覧ください。

データセットとして保存されたノード内でのみ、TransformOutputを使用してファイルを書き込むことができます。コンソール内でTransformOutputを使用してファイルを書き込むことはできません。

例:Rのdata.frameをRDSファイルに保存する

以下のコードを使用して、Rのdata.frameをRDSファイルに保存します。

Copied!
1 2 3 4 5 6 7 8 9 # RのデータフレームをRDSファイルに書き込む関数を定義します write_rds_file <- function(r_dataframe) { # 新しい出力オブジェクトを作成します output <- new.output() # ファイルシステムオブジェクトを取得します output_fs <- output$fileSystem() # RのデータフレームをRDSファイルに保存します。'w'は書き込みモードを意味します。 saveRDS(r_dataframe, output_fs$get_path("my_RDS_file.rds", 'w')) }

例: プロットをPDFに保存する

以下のコードを使用して、プロットをPDFに保存してください。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 plot_pdf <- function() { library(ggplot2) # ggplot2 ライブラリを読み込む theme_set(theme_bw()) # bw テーマを設定する data("midwest", package = "ggplot2") # ggplot2 パッケージから "midwest" データを読み込む # 散布図 gg <- ggplot(midwest, aes(x=area, y=poptotal)) + # x軸にエリア、y軸に総人口を設定 geom_point(aes(col=state, size=popdensity)) + # ポイントの色を州、サイズを人口密度に設定 geom_smooth(method="loess", se=F) + # データのスムージングを行う xlim(c(0, 0.1)) + # x軸の範囲を設定 ylim(c(0, 500000)) + # y軸の範囲を設定 labs(subtitle="Area Vs Population", # サブタイトルを設定 y="Population", # y軸のラベルを設定 x="Area", # x軸のラベルを設定 title="Scatterplot", # タイトルを設定 caption = "Source: midwest") # キャプションを設定 output <- new.output() # 新しい出力オブジェクトを作成 output_fs <- output$fileSystem() # 出力オブジェクトのファイルシステムを取得 pdf(output_fs$get_path("my pdf example.pdf", 'w')) # PDFファイルを作成 plot(gg) # 散布図を描画 }

例:コネクションを使用してTXTファイルを書き込む

以下のコードを使用して、コネクションを使用してTXTファイルを書き込む。

Copied!
1 2 3 4 5 6 7 # 日本語のコメントを追加します。 write_txt_file <- function() { output <- new.output() # 出力オブジェクトを作成 output_fs <- output$fileSystem() # ファイルシステムを取得 conn <- output_fs$open("my file.txt", 'w') # ファイルを書き込みモードで開く writeLines(c("Hello", "world"), conn) # ファイルに行を書き込む }

例:TXT ファイルをリモートパスにアップロードする

以下のコードを使用して、ローカルパスの output.txt というテキストファイルをリモートパスの output_test.txt にアップロードします。保存されたデータセットでは、output_test.txt という名前のファイルを1つ見ることができます。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 upload <- function() { # 新しい出力オブジェクトを作成 output <- new.output() # 出力オブジェクトのファイルシステムを取得 output_fs <- output$fileSystem() # ファイルコネクションを作成 fileConn<-file("output.txt") # ファイルにヘッダーを書き込む writeLines(c("Header 1"), fileConn) # ファイルコネクションを閉じる close(fileConn) # ファイルをアップロードする output_fs$upload("output.txt", "output_test.txt") }
Copied!
1 2 3 4 5 6 7 8 9 10 11 # 日本語でのコメントを追加します write_txt_file <- function() { # 新しい出力オブジェクトを作成 output <- new.output() # 出力オブジェクトからファイルシステムオブジェクトを取得 output_fs <- output$fileSystem() # "my file.txt" という名前のファイルを書き込みモードで開く conn <- output_fs$open("my file.txt", 'w') # "Hello" と "world" という文字列をファイルに書き込む writeLines(c("Hello", "world"), conn) }

例: パーティションで分割された Spark データフレームの作成

以下のコードを使用して、行 A と B によってパーティション分割された Spark データフレームを作成します。

Copied!
1 2 3 4 5 6 write_partitioned_df <- function(spark_df) { output <- new.output() # colAとcolBでパーティションを作成します output$write.spark.df(spark_df, partition_cols=list("colA", "colB")) }