web-dev-qa-db-ja.com

AWS Glue:出力にソースファイル名を含む列を追加するにはどうすればよいですか?

Glueジョブの列としてソースファイル名を追加する方法を知っている人はいますか?

S3でいくつかのファイルをクロールしてスキーマを作成するフローを作成しました。次に、ファイルを新しい形式に変換するジョブを作成し、それらのファイルをCSVとして別のS3バケットに書き戻し、パイプラインの残りの部分で使用できるようにします。私たちがやりたいのは、ある種のジョブメタプロパティにアクセスして、元のファイル名を含む出力ファイルに新しい列を追加できるようにすることです。

AWSのドキュメントとaws-glue-libsソースを調べましたが、飛び出したものは何も見つかりませんでした。理想的には、awsglue.jobパッケージからメタデータを取得する方法があります(pythonフレーバーを使用しています)。

私はまだGlueを学んでいるので、間違った用語を使用している場合はお詫びします。これにsparkタグも付けました。これは、Glueが内部で使用しているものだと思うからです。

5
markwatson

Etlジョブでsparkを使用してそれを行うことができます:

var df = glueContext.getCatalogSource(
  database = database,
  tableName = table,
  transformationContext = s"source-$database.$table"
).getDynamicFrame()
 .toDF()
 .withColumn("input_file_name", input_file_name())

glueContext.getSinkWithFormat(
  connectionType = "s3",
  options = JsonOptions(Map(
    "path" -> args("DST_S3_PATH")
  )),
  transformationContext = "",
  format = "parquet"
).writeDynamicFrame(DynamicFrame(df, glueContext))

GetCatalogSource()APIでのみ機能し、create_dynamic_frame_from_options()では機能しないことを忘れないでください

3
Yuriy Bondaruk

AWS Glue Python自動生成されたスクリプトを使用して、次の行を追加しました。

from pyspark.sql.functions import input_file_name

## Add the input file name column
datasource1 = datasource0.toDF().withColumn("input_file_name", input_file_name())

## Convert DataFrame back to DynamicFrame
datasource2 = datasource0.fromDF(datasource1, glueContext, "datasource2")

次に、コードのApplyMappingまたはdatasinkの部分で、datasource2を参照します。

2
JcMaco