【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ノードを追加する
今回作成したノードは以下(数字が連結順)
Data source - S3
Transform - Custom Transform
Transform - Select From Collection
Data target - RedShift
この記事が気に入ったらサポートをしてみませんか?