データ接続と統合Java基本的なトランスフォーム例

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

例

高レベルのトランスフォーム

Java でのデータ変換では、DataFrame オブジェクトの読み取り、処理、書き込みを行うのが一般的です。Java API では、DataFrame は Dataset<Row> として表されます。データ変換が DataFrame オブジェクトに依存する場合は、高レベルの Transform を定義できます。高レベルの Transform は、Dataset<Row> 型の入力を受け取り、計算関数が Dataset<Row> 型の出力を1つ返すことを想定しています。または、より汎用的な低レベルの Transform を定義し、asDataFrame() メソッドを明示的に呼び出して、入力データセットを含む Dataset<Row> にアクセスすることもできます。

高レベルの Transform を定義するには、Dataset<Row> 型の入力を任意の数だけ受け取り、Dataset<Row> 型の出力を1つ返す計算関数を定義します。

自動登録

myproject.datasets パッケージに HighLevelAutoTransform というクラスを作成して Transform を定義する例を示します。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package myproject.datasets; import com.palantir.transforms.lang.java.api.Compute; import com.palantir.transforms.lang.java.api.Input; import com.palantir.transforms.lang.java.api.Output; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; /** * これは、自動登録を想定した高レベルのトランスフォームの例です。 */ public final class HighLevelAutoTransform { // 自動登録されるトランスフォームのクラスには、計算関数と // 入力/出力データセットに関する情報が含まれます。 // 自動登録には「@Input」と「@Output」の注釈が必要です。 @Compute @Output("/path/to/output/dataset") public Dataset<Row> myComputeFunction(@Input("/path/to/input/dataset") Dataset<Row> myInput) { // 高レベルのトランスフォームの計算関数は、Dataset<Row> 型の出力を返します。 return myInput.limit(10); } }

高レベルのトランスフォームは、複数の入力と1つの出力をサポートします。そのため、各入力パラメーターには @Input(入力データセットのフルパスを含みます)アノテーションを付け、計算関数には @Output(出力データセットのフルパスを含みます)アノテーションを付ける必要があります。

これで、PipelineDefiner の実装内で Pipeline.autoBindFromPackage() メソッドを呼び出して、この Transform をプロジェクトの Pipeline に追加できます。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 package myproject; import com.palantir.transforms.lang.java.api.Pipeline; import com.palantir.transforms.lang.java.api.PipelineDefiner; public final class MyPipelineDefiner implements PipelineDefiner { @Override public void define(Pipeline pipeline) { // 自動登録するトランスフォームを含む Java パッケージを // 指定します。 pipeline.autoBindFromPackage("myproject.datasets"); } }

手動登録

myproject.datasets パッケージに HighLevelManualFunction というクラスを作成して Transform を定義する例を示します。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package myproject.datasets; import com.palantir.transforms.lang.java.api.Compute; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; /** * これは、手動登録を想定した高レベルのトランスフォームの計算関数の例です。 */ public final class HighLevelManualFunction { // 手動登録されるトランスフォームのクラスには、計算関数のみが含まれます。 @Compute public Dataset<Row> myComputeFunction(Dataset<Row> myInput) { // 高レベルのトランスフォームの計算関数は、Dataset<Row> 型の出力を返します。 return myInput.limit(10); } }

次に、PipelineDefiner の実装内で HighLevelTransform.builder() を使用して Transform の定義を完成させ、Pipeline.register() を呼び出して、この Transform をプロジェクトの Pipeline に追加します。

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 package myproject; import com.palantir.transforms.lang.java.api.HighLevelTransform; import com.palantir.transforms.lang.java.api.Pipeline; import com.palantir.transforms.lang.java.api.PipelineDefiner; import myproject.datasets.HighLevelManualFunction; public final class MyPipelineDefiner implements PipelineDefiner { @Override public void define(Pipeline pipeline) { // これは、高レベルのトランスフォームを手動登録するサンプルです。 HighLevelTransform highLevelManualTransform = HighLevelTransform.builder() // 使用する計算関数を渡します。ここでは、HighLevelManualFunction は // 高レベルのトランスフォームの計算関数のクラス名に対応します。 .computeFunctionInstance(new HighLevelManualFunction()) // 使用する入力データセットを渡します。 // myInput は、計算関数の入力パラメーターに対応します。 .putParameterToInputAlias("myInput", "/path/to/input/dataset") // 使用する出力データセットを渡します。 .returnedAlias("/path/to/output/dataset") .build(); pipeline.register(highLevelManualTransform); } }

高レベルのトランスフォームは、複数の入力と1つの出力をサポートします。計算関数の各入力データセットは、putParameterToInputAlias() を使用して指定します。このメソッドには、計算関数のパラメーターに対応する入力名と、それに続けて入力データセットのフルパスを指定する必要があります。たとえば、上記の例では、「myInput」は my_compute_function() の入力パラメーター名です。出力データセットのフルパスは、returnedAlias() を使用して指定します。

低レベルのトランスフォーム

DataFrame オブジェクトまたはファイルに依存するデータ変換を作成する場合は、低レベルの Transform を使用できます。

自動登録

自動登録を使用する場合を考えます。myproject.datasets パッケージに LowLevelAutoTransform というクラスを定義して Transform オブジェクトを作成する例を示します。

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 package myproject.datasets; import com.palantir.transforms.lang.java.api.Compute; import com.palantir.transforms.lang.java.api.FoundryInput; import com.palantir.transforms.lang.java.api.FoundryOutput; import com.palantir.transforms.lang.java.api.Input; import com.palantir.transforms.lang.java.api.Output; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; /** * これは、自動登録を想定した低レベルのトランスフォームの例です。 */ public final class LowLevelAutoTransform { // 自動登録されるトランスフォームのクラスには、計算関数と // 入力/出力データセットに関する情報が含まれます。 // 自動登録には「@Input」と「@Output」の注釈が必要です。 @Compute public void myComputeFunction( @Input("/path/to/input/dataset") FoundryInput myInput, @Output("/path/to/output/dataset") FoundryOutput myOutput) { Dataset<Row> limited = myInput.asDataFrame().read().limit(10); // 低レベルのトランスフォームの計算関数は、出力データセットに書き込みを行い、 // 出力を返すことはありません。 myOutput.getDataFrameWriter(limited).write(); } }

低レベルのトランスフォームは、複数の入力データセットと出力データセットをサポートします。そのため、各入力パラメーターには @Input(入力データセットのフルパスを含みます)アノテーションを付け、各出力パラメーターには @Output(出力データセットのフルパスを含みます)アノテーションを付ける必要があります。

これで、PipelineDefiner の実装内で Pipeline.autoBindFromPackage() メソッドを呼び出して、この Transform をプロジェクトの Pipeline に追加できます。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 package myproject; import com.palantir.transforms.lang.java.api.Pipeline; import com.palantir.transforms.lang.java.api.PipelineDefiner; public final class MyPipelineDefiner implements PipelineDefiner { @Override public void define(Pipeline pipeline) { // 自動登録するトランスフォームを含む Java パッケージを // 指定します。 pipeline.autoBindFromPackage("myproject.datasets"); } }

手動登録

次に、手動登録を使用する場合を考えます。この場合は、計算関数だけを含むクラスを定義します。myproject.datasets パッケージに LowLevelManualFunction というクラスを定義する例を示します。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package myproject.datasets; import com.palantir.transforms.lang.java.api.Compute; import com.palantir.transforms.lang.java.api.FoundryInput; import com.palantir.transforms.lang.java.api.FoundryOutput; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; /** * これは、手動登録を想定した低レベルのトランスフォームの計算関数の例です。 */ public final class LowLevelManualFunction { // 手動登録されるトランスフォームのクラスには、計算関数のみが含まれます。 @Compute public void myComputeFunction(FoundryInput myInput, FoundryOutput myOutput) { Dataset<Row> limited = myInput.asDataFrame().read().limit(10); // 低レベルのトランスフォームの計算関数は、出力データセットに書き込みを行い、 // 出力を返すことはありません。 myOutput.getDataFrameWriter(limited).write(); } }

次に、PipelineDefiner の実装内で LowLevelTransform.builder() を使用して実際の Transform オブジェクトを作成し、Pipeline.register() を呼び出して、この Transform をプロジェクトの Pipeline に追加します。

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 package myproject; import com.palantir.transforms.lang.java.api.LowLevelTransform; import com.palantir.transforms.lang.java.api.Pipeline; import com.palantir.transforms.lang.java.api.PipelineDefiner; import myproject.datasets.LowLevelManualFunction; public final class MyPipelineDefiner implements PipelineDefiner { @Override public void define(Pipeline pipeline) { // これは、低レベルのトランスフォームを手動登録するサンプルです。 LowLevelTransform lowLevelManualTransform = LowLevelTransform.builder() // 使用する計算関数を渡します。ここでは、LowLevelManualFunction は // 低レベルのトランスフォームの計算関数のクラス名に対応します。 .computeFunctionInstance(new LowLevelManualFunction()) // 使用する入力データセットを渡します。 // myInput は、計算関数の入力パラメーターに対応します。 .putParameterToInputAlias("myInput", "/path/to/input/dataset") // 使用する出力データセットを渡します。 // myOutput は、計算関数の入力パラメーターに対応します。 .putParameterToOutputAlias("myOutput", "/path/to/output/dataset") .build(); pipeline.register(lowLevelManualTransform); } }

低レベルのトランスフォームは、複数の入力データセットと出力データセットをサポートします。計算関数の各入力データセットは putParameterToInputAlias() を使用して指定し、各出力データセットは putParameterToOutputAlias() を使用して指定します。これらのメソッドには、計算関数のパラメーターに対応する入力名または出力名と、入力データセットまたは出力データセットのフルパスを指定する必要があります。たとえば、上記の例では、「myInput」と「myOutput」は my_compute_function() の入力パラメーター名です。低レベルのトランスフォームの計算関数は、出力データセットに書き込みを行い、値を返さないことを思い出してください。このため、入力データセットと出力データセットは、計算関数にパラメーターとして渡されます。