【AWS Glue】Visual ETLジョブでRedshiftのnumeric型にデータ登録しようとすると「xxx_decimal(10,2)」カラムが出来てしまう事象に対する対応


やりたかったこと

Glue Visual ETLを使ってS3のcsvデータをRedshiftのテーブルのnumeric型のカラムに登録する

起きたこと

Change Schemaノードを使用してDataTypeを「decimal」に変更してjob実行
→元々あったRedshiftテーブルのnumeric型のカラムxxxには登録されず、新たに「xxx_decimal(10,2)」というカラムが追加された
※Redshiftにおいてnumericとdecimalは、ほぼ同じ意味で使用される

原因

Change Schemaノードで変換されたdecimalはdecimal(10,2)として扱われるため、Redshiftのnumeric型のカラムとの間に桁数の違い*が生じデータを挿入できなかった
*桁数を指定しないと、numericはnumeric(18,0)として扱われる

対処法

以下のいずれかの対処法がある
①Redshiftのnumeric型のカラムの桁数を(10,2)にする
②Visual ETL の処理で桁数を(18,0) にする
今回はRedshift側の桁数を維持する必要があったため②で対応した

対処法② - Visual ETL の処理で桁数を(18,0) にする

(1)Change Schemaの代わりにCustom Transformノードを使用し、桁数を指定する

//Code block 例

def MyTransform (glueContext, dfc) -> DynamicFrameCollection:
    dyf = SelectFromCollection.apply(
      dfc=dfc,
      key=list(dfc.keys())[0]
    )
    # Script generated for node Change Schema
    dyf = ApplyMapping.apply(
        frame=dyf,
        mappings=[
            ("map1", "string", "map1", "decimal(18,0)"),
            ("map2", "string", "map2", "varchar"),
            ("map3", "string", "map3", "decimal(18,1)"),
            ("map4", "string", "map4", "decimal(18,0)"),
        ],
    )
    return DynamicFrameCollection({"CustomTransform0": dyf}, glueContext)

(2)DynamicFrameを取り出すため、Select From Collectionノードを追加する

今回作成したノードは以下(数字が連結順)

  1. Data source - S3

  2. Transform - Custom Transform

  3. Transform - Select From Collection

  4. Data target - RedShift

この記事が気に入ったらサポートをしてみませんか?