分析Code WorkbooksWorkbooksグローバルコード

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

グローバルコード

Workbook インターフェースの右側からアクセスできるグローバルコードペインでは、Workbook 全体で、同じ言語のすべてのコードトランスフォームから利用可能な変数や関数を定義できます。たとえば、グローバルコードを使って、複数のトランスフォームで使用する定数や、繰り返し使用するヘルパー関数を定義できます。

例

この例では、titanic_dataset に基づいて、乗客の年齢を受け取り、その年齢層を返すシンプルな関数を記述します。

まず、ページの右側にある Python のグローバルコードパネルを開きます。パネルは次のように表示されます。

グローバルコード

グローバルコードパネルを開いたら、次のコードをパネルにコピーして貼り付けます。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 def return_age_bracket(age): if age is None: return 'Not specified' elif (age <= 12): return '12 and under' elif (age >= 13 and age < 19): return 'Between 13 and 19' elif (age >= 19 and age < 65): return 'Between 19 and 65' elif (age >= 65): return '65 and over' else: return 'N/A'

このグローバル関数を使用するには、titanic_dataset から派生する新しい Python トランスフォームを作成し、次のコードをトランスフォームに貼り付けます。

Copied!
1 2 3 4 5 6 7 8 9 10 11 def passengers_by_age_bracket_udf(titanic_dataset): from pyspark.sql.functions import udf input_df = titanic_dataset age_bracket_udf = udf(return_age_bracket) output_df = input_df.withColumn("age_bracket", age_bracket_udf(input_df.Age)) output_df = output_df.select(output_df.Name, output_df.age_bracket) return output_df

コードを実行します。次の出力が表示されます。

年齢層別の乗客

ユーザー定義関数 (UDF)、特にループを含む関数は効率が悪いことが多いため、このコードの実行には時間がかかる場合があります。グローバルに定義された関数の使用が、常にベストプラクティスとは限りません。この例では、pyspark.functions に、よりシンプルな方法として when((condition), result).otherwise(result) が用意されています。

UDF を使わずに、上記と同じ結果を得てみます。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 def passengers_by_age_bracket(titanic_dataset): from pyspark.sql import functions as F input_df = titanic_dataset output_df = input_df.withColumn("age_bracket", F.when(input_df.Age.isNull(), 'Not specified')\ .when( input_df.Age <= 12, '12 and under')\ .when(( (input_df.Age >= 13) & (input_df.Age < 19)), 'Between 13 and 19')\ .when(( (input_df.Age >= 19) & (input_df.Age < 65)), 'Between 19 and 65')\ .when(input_df.Age >= 65, '65 and over').otherwise('N/A')) output_df = output_df.select('Name','age_bracket') return output_df

ほとんどの条件では、UDF を使うと数分かかるのに対し、上記の変換は数秒で実行されるはずです。

再現性に関する注意

結果の再現性を確保するため、グローバルコードの変数や関数を変更しても、その変更はほかのトランスフォームに伝播しません。たとえば、Python でグローバルコードに次のようなリストを定義したとします。

Copied!
1 my_list = [1,2,3,4]

次に、トランスフォームでリストを更新します。

Copied!
1 2 3 def my_transform(input_df): my_list.append(5) print(my_list)

my_transform を実行すると [1,2,3,4,5] が出力されますが、ほかのトランスフォームが受け取る値は引き続き [1,2,3,4] です。