企業が情報に基づいた意思決定を行い、業務を改善し、イノベーションを起こすためには、データが不可欠です。さまざまなデータソースからのデータを統合することは、複雑で時間のかかるプロセスです。AWS が提供する AWS Glue は、分析、機械学習 (ML)、およびアプリケーション開発を行うために、サーバーレスインフラストラクチャ上で複数のデータソースからデータを統合するに役立ちます。AWS Glue は、ETL を含むデータ統合ジョブを構築するためのさまざまな開発環境を提供しています。最も一般的なオプションの 1 つはノートブックです。データサイエンティストは、クエリをインタラクティブに実行してすぐに結果を取得しながら データ統合ジョブを開発する傾向があります。このインタラクティブな体験により、データ処理パイプラインの構築を加速できます。
2023年4月、AWS は Amazon CodeWhisperer の一般提供を発表しました。Amazon CodeWhisperer は、内部で生成系 AI ・基盤モデルを使用して開発者の生産性を向上させる AI コーディング支援サービスです。これは、自然言語による開発者のコメントと、統合開発環境 (IDE) 内にすでに記述されたプログラムコードに基づいて、リアルタイムで AI がコードの候補を自動生成して提案します。さらに、AWS は Amazon CodeWhisperer Jupyter エクステンションも発表しました。これは Jupyter Lab と Amazon SageMaker Studio 上の Python ノートブック向けに、単一行または関数全体のコード提案をリアルタイム生成することで、Jupyter 利用者を支援するものです。
本日、AWS Glue Studio ノートブック Amazon CodeWhisperer のサポートを発表できることを嬉しく思います。これにより、AWS Glue 利用者のユーザー体験を改善し、開発生産性向上に貢献します。Glue Studio ノートブックに、「JSON ファイルから Spark DataFrame を作成する」などの特定のタスクの概要を示すコメントを自然言語 (英語) で記述すると、この情報に基づいて CodeWhisperer はタスクを実行できる 1 つ以上のコードスニペットをノートブック上に直接提案します。提案されたコードをすぐに採用したり、他の提案を確認したり、または独自のコードを書くこともできます。
この投稿では、Amazon CodeWhisperer の統合によって AWS Glue Studio ノートブックのユーザー体験がどのように変化したかを紹介します。
前提条件
このチュートリアルを進める前に、以下の前提条件を満たす必要があります。
- AWS Glue Studioをセットアップします
- Amazon CodeWhisperer と連携するために AWS Identity and Access Management (IAM) ロールを設定します。AWS Glue Studio ノートブックの IAM ロールに次のポリシーをアタッチしてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CodeWhispererPermissions",
"Effect": "Allow",
"Action": [
"codewhisperer:GenerateRecommendations"
],
"Resource": "*"
}
]
}
スタートガイド
さっそく始めましょう。次のステップを実行して、新しい AWS Glue Studio ノートブックジョブを作成します。
- AWS Glue コンソールナビゲーションペイン内の ETL jobs の下の Notebooks 選択します。
- Jupyter Notebook を選択し、Create を選択します。
- Job name に
codewhisperer-demo
と入力します。
- IAM Role には、前提条件として設定した IAM ロールを選択します。
- Start notebook を選択します。
サンプルセルを含む新しいノートブックが作成されます。
下記のように画面一番下に CodeWhispererという名前のメニューがあります。このメニューを選択すると、各種ショートカットのほか、自動提案機能の無効化を含むいくつかのオプションが表示されます。
Amazon CodeWhisperer によるコード提案機能を試してみましょう。この記事にはコードの提案例が含まれていますが、Amazon CodeWhisperer が提案するコードスニペットは、この記事の例と異なる可能性があります。
ノートブックで新しいセルを追加し、実現したい処理をコメント入力します。Enter キーを押すと、提案コードが表示されます。
Tab キーを押すと提案されたコードを採用できます。あるいは、矢印キーを押すと他の提案コードを確認できます。詳細については、ユーザーアクションを参照してください。
それでは、Amazon Simple Storage Service (Amazon S3) から JSON ファイルを読み込んでみましょう。ノートブックのセルに次のコメントを入力し、Enter キーを押します。
# Create a Spark DataFrame from a json file
CodeWhisperer は次のようなコードスニペットを提案します。
def create_spark_df_from_json(spark, file_path):
return spark.read.json(file_path)
次に、提案されたコードスニペットを用いて次のように利用します
df = create_spark_df_from_json(spark, "s3://awsglue-datasets/examples/us-legislators/all/persons.json")
df.show()
上記を実行すると、以下のような結果を出力します。
+----------+--------------------+----------+-----------+------+----------+--------------------+--------------------+--------------------+--------------------+--------------------+------------------+--------------------+----------------+
|birth_date| contact_details|death_date|family_name|gender|given_name| id| identifiers| image| images| links| name| other_names| sort_name|
+----------+--------------------+----------+-----------+------+----------+--------------------+--------------------+--------------------+--------------------+--------------------+------------------+--------------------+----------------+
|1944-10-15| null| null| Collins| male| Michael|0005af3a-9471-4d1...|[{C000640, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Mac Collins|[{bar, Mac Collin...|Collins, Michael|
|1969-01-31|[{fax, 202-226-07...| null| Huizenga| male| Bill|00aa2dc0-bfb6-441...|[{Bill Huizenga, ...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Bill Huizenga|[{da, Bill Huizen...| Huizenga, Bill|
|1959-09-28|[{phone, 202-225-...| null| Clawson| male| Curtis|00aca284-9323-495...|[{C001102, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (comm...| Curt Clawson|[{bar, Curt Claws...| Clawson, Curtis|
|1930-08-14| null|2001-10-26| Solomon| male| Gerald|00b73df5-4180-441...|[{S000675, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Gerald Solomon|[{null, Gerald B....| Solomon, Gerald|
|1960-05-28|[{fax, 202-225-42...| null| Rigell| male| Edward|00bee44f-db04-4a7...|[{R000589, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| E. Scott Rigell|[{null, Scott Rig...| Rigell, Edward|
|1951-05-20|[{twitter, MikeCr...| null| Crapo| male| Michael|00f8f12d-6e27-4a2...|[{Mike Crapo, bal...|https://theunited...|[{https://theunit...|[{Wikipedia (da),...| Mike Crapo|[{da, Mike Crapo,...| Crapo, Michael|
|1926-05-12| null| null| Hutto| male| Earl|015d77c8-6edb-4ed...|[{H001018, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Earl Hutto|[{null, Earl Dewi...| Hutto, Earl|
|1937-11-07| null|2015-11-19| Ertel| male| Allen|01679bc3-da21-482...|[{E000208, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Allen Ertel|[{null, Allen E. ...| Ertel, Allen|
|1916-09-01| null|2007-11-24| Minish| male| Joseph|018247d0-2961-423...|[{M000796, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Joseph Minish|[{bar, Joseph Min...| Minish, Joseph|
|1957-08-04|[{phone, 202-225-...| null| Andrews| male| Robert|01b100ac-192e-4b5...|[{A000210, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Robert E. Andrews|[{null, Rob Andre...| Andrews, Robert|
|1957-01-10|[{fax, 202-225-57...| null| Walden| male| Greg|01bc21bf-8939-487...|[{Greg Walden, ba...|https://theunited...|[{https://theunit...|[{Wikipedia (comm...| Greg Walden|[{bar, Greg Walde...| Walden, Greg|
|1919-01-17| null|1987-11-29| Kazen| male| Abraham|02059c1e-0bdf-481...|[{K000025, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...|Abraham Kazen, Jr.|[{null, Abraham K...| Kazen, Abraham|
|1960-01-11|[{fax, 202-225-67...| null| Turner| male| Michael|020aa7dd-54ef-435...|[{Michael R. Turn...|https://theunited...|[{https://theunit...|[{Wikipedia (comm...| Michael R. Turner|[{null, Mike Turn...| Turner, Michael|
|1942-06-28| null| null| Kolbe| male| James|02141651-eca2-4aa...|[{K000306, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Jim Kolbe|[{ca, Jim Kolbe, ...| Kolbe, James|
|1941-03-08|[{fax, 202-225-79...| null| Lowenthal| male| Alan|0231c6ef-6e92-49b...|[{Alan Lowenthal,...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Alan S. Lowenthal|[{null, Alan Lowe...| Lowenthal, Alan|
|1952-01-09|[{fax, 202-225-93...| null| Capuano| male| Michael|0239032f-be5c-4af...|[{Michael Capuano...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...|Michael E. Capuano|[{null, Mike Capu...|Capuano, Michael|
|1951-10-19|[{fax, 202-225-56...| null| Schrader| male| Kurt|0263f619-eff8-4e1...|[{Kurt Schrader, ...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Kurt Schrader|[{bar, Kurt Schra...| Schrader, Kurt|
|1947-06-13|[{fax, 202-225-69...| null| Nadler| male| Jerrold|029e793d-ec40-4a1...|[{N000002, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Jerrold Nadler|[{ca, Jerrold Nad...| Nadler, Jerrold|
|1970-02-03|[{fax, 202-225-82...| null| Graves| male| Tom|02b621fc-0523-449...|[{Tom Graves, bal...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Tom Graves|[{bar, Tom Graves...| Graves, Tom|
|1932-05-09| null| null| McMillan| male| John|03018f7c-f866-419...|[{M000566, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| John McMillan|[{null, Alex McMi...| McMillan, John|
+----------+--------------------+----------+-----------+------+----------+--------------------+--------------------+--------------------+--------------------+--------------------+------------------+--------------------+----------------+
only showing top 20 rows
以上のように、Amazon CodeWhisperer が提案するコードスニペットをすぐに活用できます。
提案コードの例
このセクションでは、コード提案の例をさらに紹介します。これらはあくまで例であり、Amazon CodeWhisperer によって異なるコードスニペットが提案される場合があることに注意してください。
計算を含む列の追加
抽出、変換、ロード (ETL) のユースケースでは、既存の列から新しい列を追加するのが一般的です。Spark DataFrame に列を追加する必要がある場合、列のデータ型や各属性情報を Amazon CodeWhisperer に詳細なレベルで明確に伝えることができます。
# Add age column to a given person DataFrame
# age is calculated from current date and birth_date. When death_date is not null, then use death_date to calculate age
Amazon CodeWhisperer は以下のようなコードスニペットを提案します。
def add_age_column(df):
# Use current date to calculate age
current_date = current_timestamp()
# Use birth_date column to calculate age
df = df.withColumn("age", datediff(current_date, df.birth_date) / 365)
# Use death_date column to calculate age
df = df.withColumn("age", when(df.death_date.isNull(), df.age).otherwise(datediff(df.death_date, df.birth_date) / 365))
return df
この関数は以下のように使用できます。
df = add_age_column(df)
df.show()
上記を実行すると以下のような結果を出力します。
+----------+--------------------+----------+-----------+------+----------+--------------------+--------------------+--------------------+--------------------+--------------------+------------------+--------------------+----------------+------------------+--------------------+
|birth_date| contact_details|death_date|family_name|gender|given_name| id| identifiers| image| images| links| name| other_names| sort_name| age| current_date|
+----------+--------------------+----------+-----------+------+----------+--------------------+--------------------+--------------------+--------------------+--------------------+------------------+--------------------+----------------+------------------+--------------------+
|1944-10-15| null| null| Collins| male| Michael|0005af3a-9471-4d1...|[{C000640, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Mac Collins|[{bar, Mac Collin...|Collins, Michael| 78.71506849315068|2023-06-14 06:12:...|
|1969-01-31|[{fax, 202-226-07...| null| Huizenga| male| Bill|00aa2dc0-bfb6-441...|[{Bill Huizenga, ...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Bill Huizenga|[{da, Bill Huizen...| Huizenga, Bill| 54.4027397260274|2023-06-14 06:12:...|
|1959-09-28|[{phone, 202-225-...| null| Clawson| male| Curtis|00aca284-9323-495...|[{C001102, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (comm...| Curt Clawson|[{bar, Curt Claws...| Clawson, Curtis| 63.75342465753425|2023-06-14 06:12:...|
|1930-08-14| null|2001-10-26| Solomon| male| Gerald|00b73df5-4180-441...|[{S000675, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Gerald Solomon|[{null, Gerald B....| Solomon, Gerald| 71.24931506849315|2023-06-14 06:12:...|
|1960-05-28|[{fax, 202-225-42...| null| Rigell| male| Edward|00bee44f-db04-4a7...|[{R000589, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| E. Scott Rigell|[{null, Scott Rig...| Rigell, Edward|63.087671232876716|2023-06-14 06:12:...|
|1951-05-20|[{twitter, MikeCr...| null| Crapo| male| Michael|00f8f12d-6e27-4a2...|[{Mike Crapo, bal...|https://theunited...|[{https://theunit...|[{Wikipedia (da),...| Mike Crapo|[{da, Mike Crapo,...| Crapo, Michael| 72.11780821917809|2023-06-14 06:12:...|
|1926-05-12| null| null| Hutto| male| Earl|015d77c8-6edb-4ed...|[{H001018, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Earl Hutto|[{null, Earl Dewi...| Hutto, Earl| 97.15616438356165|2023-06-14 06:12:...|
|1937-11-07| null|2015-11-19| Ertel| male| Allen|01679bc3-da21-482...|[{E000208, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Allen Ertel|[{null, Allen E. ...| Ertel, Allen| 78.08493150684932|2023-06-14 06:12:...|
|1916-09-01| null|2007-11-24| Minish| male| Joseph|018247d0-2961-423...|[{M000796, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Joseph Minish|[{bar, Joseph Min...| Minish, Joseph| 91.2904109589041|2023-06-14 06:12:...|
|1957-08-04|[{phone, 202-225-...| null| Andrews| male| Robert|01b100ac-192e-4b5...|[{A000210, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Robert E. Andrews|[{null, Rob Andre...| Andrews, Robert| 65.9041095890411|2023-06-14 06:12:...|
|1957-01-10|[{fax, 202-225-57...| null| Walden| male| Greg|01bc21bf-8939-487...|[{Greg Walden, ba...|https://theunited...|[{https://theunit...|[{Wikipedia (comm...| Greg Walden|[{bar, Greg Walde...| Walden, Greg| 66.46849315068494|2023-06-14 06:12:...|
|1919-01-17| null|1987-11-29| Kazen| male| Abraham|02059c1e-0bdf-481...|[{K000025, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...|Abraham Kazen, Jr.|[{null, Abraham K...| Kazen, Abraham| 68.91232876712328|2023-06-14 06:12:...|
|1960-01-11|[{fax, 202-225-67...| null| Turner| male| Michael|020aa7dd-54ef-435...|[{Michael R. Turn...|https://theunited...|[{https://theunit...|[{Wikipedia (comm...| Michael R. Turner|[{null, Mike Turn...| Turner, Michael|63.465753424657535|2023-06-14 06:12:...|
|1942-06-28| null| null| Kolbe| male| James|02141651-eca2-4aa...|[{K000306, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Jim Kolbe|[{ca, Jim Kolbe, ...| Kolbe, James| 81.01643835616439|2023-06-14 06:12:...|
|1941-03-08|[{fax, 202-225-79...| null| Lowenthal| male| Alan|0231c6ef-6e92-49b...|[{Alan Lowenthal,...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Alan S. Lowenthal|[{null, Alan Lowe...| Lowenthal, Alan| 82.32328767123288|2023-06-14 06:12:...|
|1952-01-09|[{fax, 202-225-93...| null| Capuano| male| Michael|0239032f-be5c-4af...|[{Michael Capuano...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...|Michael E. Capuano|[{null, Mike Capu...|Capuano, Michael| 71.47671232876712|2023-06-14 06:12:...|
|1951-10-19|[{fax, 202-225-56...| null| Schrader| male| Kurt|0263f619-eff8-4e1...|[{Kurt Schrader, ...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Kurt Schrader|[{bar, Kurt Schra...| Schrader, Kurt| 71.7013698630137|2023-06-14 06:12:...|
|1947-06-13|[{fax, 202-225-69...| null| Nadler| male| Jerrold|029e793d-ec40-4a1...|[{N000002, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Jerrold Nadler|[{ca, Jerrold Nad...| Nadler, Jerrold| 76.05479452054794|2023-06-14 06:12:...|
|1970-02-03|[{fax, 202-225-82...| null| Graves| male| Tom|02b621fc-0523-449...|[{Tom Graves, bal...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Tom Graves|[{bar, Tom Graves...| Graves, Tom|53.394520547945206|2023-06-14 06:12:...|
|1932-05-09| null| null| McMillan| male| John|03018f7c-f866-419...|[{M000566, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| John McMillan|[{null, Alex McMi...| McMillan, John| 91.15890410958905|2023-06-14 06:12:...|
+----------+--------------------+----------+-----------+------+----------+--------------------+--------------------+--------------------+--------------------+--------------------+------------------+--------------------+----------------+------------------+--------------------+
only showing top 20 rows
行のソートと抽出
Amazon CodeWhisperer を使用して Spark DataFrame 内のデータをソートしたり、行を抽出したりすることもできます。
# Show top 5 oldest persons from DataFrame
# Use age column
Amazon CodeWhisperer は以下のようなコードスニペットを提案します。
def get_oldest_person(df):
return df.orderBy(desc("age")).limit(5)
この関数は以下のように使用できます。
get_oldest_person(df).show()
上記のコードは以下のような結果を出力します。
+----------+---------------+----------+-----------+------+----------+--------------------+--------------------+--------------------+--------------------+--------------------+---------------+--------------------+---------------+------------------+--------------------+
|birth_date|contact_details|death_date|family_name|gender|given_name| id| identifiers| image| images| links| name| other_names| sort_name| age| current_date|
+----------+---------------+----------+-----------+------+----------+--------------------+--------------------+--------------------+--------------------+--------------------+---------------+--------------------+---------------+------------------+--------------------+
|1919-08-22| null| null| Winn| male| Edward|942d20ed-d838-436...|[{W000636, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...|Larry Winn, Jr.|[{null, Larry Win...| Winn, Edward|103.88219178082191|2023-06-14 06:13:...|
|1920-03-23| null| null| Smith| male| Neal|84a9cbe4-651b-46d...|[{S000596, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Neal Smith|[{null, Neal Edwa...| Smith, Neal| 103.2958904109589|2023-06-14 06:13:...|
|1920-09-17| null| null| Holt|female| Marjorie|8bfb671a-3147-4bc...|[{H000747, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Marjorie Holt|[{bar, Marjorie H...| Holt, Marjorie| 102.8082191780822|2023-06-14 06:13:...|
|1921-03-05| null| null| Bedell| male| Berkley|896f0ce3-afe4-4ea...|[{B000298, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (de),...| Berkley Bedell|[{ca, Berkley Bed...|Bedell, Berkley|102.34520547945205|2023-06-14 06:13:...|
|1921-06-23| null| null| Findley| male| Paul|2811f793-1108-4fb...|[{F000123, biogui...|https://theunited...|[{https://theunit...|[{Wikipedia (azb)...| Paul Findley|[{azb, پاول فایند...| Findley, Paul|102.04383561643836|2023-06-14 06:13:...|
+----------+---------------+----------+-----------+------+----------+--------------------+--------------------+--------------------+--------------------+--------------------+---------------+--------------------+---------------+------------------+--------------------+
Spark DataFrameでのサンプルデータセットの生成
Amazon CodeWhisperer はサンプルの Spark DataFrame も生成できるほど強力です。これは以下のように実現できます。
# Generate sample Spark DataFrame of country name and country code
# First column name is country_name, and second column name is country_code
Amazon CodeWhisperer は次のようなコードスニペットを提案します。
def get_country_code_df(spark):
return spark.createDataFrame(
[("United States", "US"), ("United Kingdom", "UK"), ("Canada", "CA")],
["country_name", "country_code"]
)
この関数は以下のように使用できます。
df = get_country_code_df(spark)
df.show()
上記のコードは以下のような結果を出力します。
+--------------+------------+
| country_name|country_code|
+--------------+------------+
| United States| US|
|United Kingdom| UK|
| Canada| CA|
+--------------+------------+
SQL の変換処理を生成
また、Amazon CodeWhisperer を使用して SQL の変換用コードスニペットを生成し、次のように SQL クエリ結果 (CTAS) から新しいテーブルを作成することもできます。
# Generate CTAS query by selecting all the records in a table with grouping by a given column
Amazon CodeWhisperer は、以下のようなコードスニペットを提案します。
def generate_ctas_query_with_group_by(table_name, group_by_col):
ctas_query = "CREATE TABLE " + table_name + " AS SELECT * FROM " + table_name + " GROUP BY " + group_by_col
return ctas_query
結論
この投稿では、AWS Glue Studio ノートブックを Amazon CodeWhisperer と統合することで、ETL を含むデータ統合ジョブをより迅速に構築できる方法について説明しました。この機能は、現在、米国東部 (バージニア北部) でご利用いただけます。Amazon CodeWhisperer で AWS Glue Studio ノートブックを使い始めると、データ統合ジョブの構築を加速できます。AWS Glue の使用を開始するには、AWS Glue にアクセスしてください。
さらに詳しく
AWS Glue ノートブックと Amazon CodeWhisperer の使用方法の詳細については、以下の動画をご覧ください。
著者について
Noritaka Sekiyama は AWS Glue チームのプリンシパルビッグデータアーキテクトです。彼は日本の東京を拠点に活動しており、顧客に役立つソフトウェアアーティファクトの構築を担当しています。余暇には、ロードバイクでサイクリングを楽しんでいます。
Gal Heyne は AI/ML、データエンジニアリング、および BI に重点を置くAWS Glue のプロダクトマネージャーで、カリフォルニアを拠点としています。顧客のビジネスニーズを深く理解し、エンジニアと協力して使いやすいデータ製品を設計することに情熱を注いでいます。余暇にはカードゲームを楽しんでいます。
原文はこちらです。
翻訳はソリューションアーキテクトの鈴木 浩之が担当しました。