注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
Code Workbook は、定義済みの表形式スキーマを持つ Foundry データセットに対する操作に加えて、データセット内の非構造化ファイルへのアクセスもサポートしています。これは、画像やその他の種類のメディアなどの非構造化データ、XML や JSON などの半構造化形式、GZ や ZIP ファイルなどの圧縮形式、RDA や RDS などの R データ形式を分析および加工する際に役立ちます。
上流データセットを Python トランスフォーム入力として読み込むことで、Python トランスフォーム内でファイルを読み込めます。この API は、基盤となるストレージを抽象化し、Foundry データセット内のファイルのパスに基づいてファイルにアクセスできる FileSystem オブジェクトを公開します。FileSystem について詳しくはこちら。。ブランチや RID などのその他の情報も公開されます(詳細はトランスフォーム入力のドキュメントを参照してください)。
入力ヘルパーバー、または入力タブで入力の種類を変更します。
Python トランスフォーム入力として読み込めるのは、インポート済みのデータセットと保存済みのデータセットのみです。データセットとして保存されていないトランスフォームは、Python トランスフォーム入力として読み込めません。
スキーマのないデータセットは、自動的にトランスフォーム入力として読み込まれるはずです。

たとえば、次のコードは 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 28import tempfile import zipfile import shutil import io from pyspark.sql import Row # datasetOfZippedFiles は、同じスキーマの3個の CSV を含む1個の ZIP ファイルを持つデータセットです: ["id", name"]。 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 を使用してファイルを書き込めるのは、データセットとして保存されているノードのみです。コンソールでは TransformOutput を使用してファイルを書き込めません。TransformOutput API について詳しくはこちら。
TransformOutput をインスタンス化し、filesystem() やその他のメソッドを呼び出して使用した後は、TransformOutput オブジェクト以外のものを返しても無視されます。
次のコードは、テキストファイルを書き込む方法の例です。
Copied!1 2 3 4 5 6 7 8def write_text_file(): output = Transforms.get_output() output_fs = output.filesystem() with output_fs.open('my text file.txt', 'w') as f: f.write("Hello world") f.close()
次のコードは、データセットを書き込み、パーティション分割と出力形式を指定する方法の例です。
Copied!1 2 3def write_dataset(input_dataset): output = Transforms.get_output() output.write_dataframe(input_dataset, partition_cols = ["colA", "colB"], output_format = 'csv')
上流データセットを R トランスフォーム入力として読み込むことで、R トランスフォーム内でファイルを読み込めます。公開される TransformInput オブジェクトにより、Foundry データセット内のファイルのパスに基づいてファイルにアクセスできます。FileSystem API について詳しくはこちら。
入力ヘルパーバー、または入力タブで入力の種類を変更します。
R トランスフォーム入力として読み込めるのは、インポート済みのデータセットと保存済みのデータセットのみです。データセットとして保存されていないトランスフォームは、R トランスフォーム入力として読み込めません。
デフォルトでは、スキーマのないデータセットの入力の種類は、すでに R トランスフォーム入力に設定されているはずです。

以下のコードを使用して、インポート済みデータセット内のファイルである RDS を読み込みます。この RDS には R の data.frame が含まれています。
Copied!1 2 3 4 5 6 7 8 9RDS_reader <- function(RDS_dataset) { fs <- RDS_dataset$fileSystem() ## The name of the file is test_loading_RDS.rds path <- fs$get_path("test_loading_RDS.rds", 'r') rds <- readRDS(path) return(rds) }
以下のコードを使用して、ZIP 圧縮された CSV の内容に rbind を適用します。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21result <- function(zip_file_with_csvs) { fs <- zip_file_with_csvs$fileSystem() ## Get the remote path (name) of the zipfile zipfile_name <- fs$ls()[[1]]$path ## Get the local path of the zipfile path <- fs$get_path(zipfile_name, 'r') # List the zipped files zipped_files <- as.list(unzip(path, list = TRUE)$Name) # For every element on the list, return a dataframe list_of_data_frames <- lapply(zipped_files, function(x){read.csv(unz(path, x), header = TRUE, sep = ",")}) # Bind all of the dataframes together 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 ファイルに保存します。
Copied!1 2 3 4 5 6write_rds_file <- function(r_dataframe) { output <- new.output() output_fs <- output$fileSystem() saveRDS(r_dataframe, output_fs$get_path("my_RDS_file.rds", 'w')) }
以下のコードを使用して、プロットを PDF に保存します。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22plot_pdf <- function() { library(ggplot2) theme_set(theme_bw()) # bw テーマを事前に設定します data("midwest", package = "ggplot2") # 散布図 gg <- ggplot(midwest, aes(x=area, y=poptotal)) + geom_point(aes(col=state, size=popdensity)) + geom_smooth(method="loess", se=F) + xlim(c(0, 0.1)) + ylim(c(0, 500000)) + labs(subtitle="Area Vs Population", y="Population", x="Area", title="Scatterplot", caption = "Source: midwest") output <- new.output() output_fs <- output$fileSystem() pdf(output_fs$get_path("my pdf example.pdf", 'w')) plot(gg) }
以下のコードを使用して、接続を使用して TXT ファイルを書き込みます。
Copied!1 2 3 4 5 6write_txt_file <- function() { output <- new.output() output_fs <- output$fileSystem() conn <- output_fs$open("my file.txt", 'w') writeLines(c("Hello", "world"), conn) }
以下のコードを使用して、ローカルパス output.txt にあるテキストファイルをリモートパス output_test.txt にアップロードします。保存されたデータセットには、output_test.txt という名前のファイルが1個表示されます。
Copied!1 2 3 4 5 6 7 8 9upload <- 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 6write_txt_file <- function() { output <- new.output() output_fs <- output$fileSystem() conn <- output_fs$open("my file.txt", 'w') writeLines(c("Hello", "world"), conn) }
以下のコードを使用して、列 A と B でパーティション分割された Spark データフレームを書き込みます。
Copied!1 2 3 4 5 6write_partitioned_df <- function(spark_df) { output <- new.output() # colA と colB でパーティション分割します output$write.spark.df(spark_df, partition_cols=list("colA", "colB")) }