流沙河鎮

情報技術系のこと書きます。

CDKでGlue DataCatalog TableにParameters(パラメータ)を指定する方法

結論

現状のGlue DataCatalog L2コンストラクトはParametersをサポートしていないので、escape hatchで対応する必要がある。
Abstractions and escape hatches - AWS Cloud Development Kit (AWS CDK) v2

Glue CDKコンストラクトを取り巻く状況

以下の2つを併せ技で利用する形になる。

@aws-cdk/aws-glue-alphaは実験段階(alpha)の位置付けであるが、DataCatalogやJobなどに関わる主要なConstructsは一通り整備されており、基本的には実践利用可能と思う。

Parameters(パラメータ)を指定したくなる代表的状況と対応

Serdeの区切り文字を指定したい場合

前提として、Glue DataCatalogはマネージドなHive metastoreであり、HiveのSerde(Serializer/Deserializer)を指定して利用する形になる。

SerDe - Apache Hive - Apache Software Foundation

hive/serde/src/java/org/apache/hadoop/hive/serde2/lazy at master · apache/hive · GitHub

Serdeによって、例えば区切り文字を指定する必要があるが、これをL2コンストラクトの引数で渡せないので、以下のようにescape hatchで指定する形になる。

import { aws_glue } from 'aws-cdk-lib';
import * as glue_alpha from '@aws-cdk/aws-glue-alpha';

    const hoge = new glue_alpha.Table(
      # 中略
      dataFormat: new glue_alpha.DataFormat({
        inputFormat: glue_alpha.InputFormat.TEXT,
        outputFormat: glue_alpha.OutputFormat.HIVE_IGNORE_KEY_TEXT,
        serializationLibrary: glue_alpha.SerializationLibrary.LAZY_SIMPLE,
      }),
      # 中略
    });

    (hoge.node.defaultChild as aws_glue.CfnTable).addPropertyOverride(
      'TableInput.StorageDescriptor.SerdeInfo.Parameters',
      {
        'serialization.format': ',',
        'field.delim': ',',
      },
    );

ここで指定している'TableInput.StorageDescriptor.SerdeInfo.Parameters'はCloudFormationの以下に該当する。

AWS::Glue::Table StorageDescriptor - AWS CloudFormation

ヘッダー行(列名が入る行)を指定したい場合

CSVなどでデータの1行目に列名が入っている場合はその点を明示しておかなければ、通常のレコードの一部として扱われてしまう。 以下のように指定する。

import { aws_glue } from 'aws-cdk-lib';
import * as glue_alpha from '@aws-cdk/aws-glue-alpha';

    const hoge = new glue_alpha.Table(
      # 中略
      dataFormat: new glue_alpha.DataFormat({
        inputFormat: glue_alpha.InputFormat.TEXT,
        outputFormat: glue_alpha.OutputFormat.HIVE_IGNORE_KEY_TEXT,
        serializationLibrary: glue_alpha.SerializationLibrary.LAZY_SIMPLE,
      }),
      # 中略
    });

    (hoge.node.defaultChild as aws_glue.CfnTable).addPropertyOverride('TableInput.Parameters', {
      'skip.header.line.count': '1',
    });

ここで指定している'TableInput.Parameters'はCloudFormationの以下に該当する。

AWS::Glue::Table TableInput - AWS CloudFormation