public note

Python のユニットテストで decorator に patch をあてる

ユニットテストでデコレータを差し替える方法を学びました。 このような、print や sleep するデコレータを例にとります。 import time def my_decorator(message="hi", sleep=0): def _my_decorator(func): def wrapper(*args, **kwargs): print("before") …

Airbyte で最新の connector registry seed を参照する

目的 Airbyte OSS 版をデフォルトの設定で運用すると connector registry seed が固定されるので、本体をバージョンアップしない限り利用可能な connector バージョンは変わりません。この seed について、Airbyte 環境から最新のものを参照する方法を書きま…

PyPI への Python パッケージリリース

いつも、どうやっているのだっけ...となるので備忘録代わりに。パッケージ管理ツールは Poetry を使っています。 (初回のみ) TestPyPI リポジトリの追加 poetry config repositories.testpypi https://test.pypi.org/legacy/ パッケージのビルド poetry buil…

PyCon APAC 2023 Day1 で ModuleNotFoundError に関する発表をしました

参加記はまた別で書きます。 会場では 30 名くらい?の方々が聴きにきてくれました。ありがとうございます。 発表したこと タイトル 2023/10/27 16:20 ~ 16:35 (Asia/Tokyo) ModuleNotFoundErrorの傾向と対策:仕組みから学ぶImport 2023-apac.pycon.jp スラ…

sqlparse で SELECT 文をパースする

SELECT 文にあるエイリアスを特定したくて、sqlparse を使ってパースしてみました。 github.com sqlparse の主要クラス sqlparse でクエリをパースするときに、下記のクラス構造を把握しておくと挙動を掴みやすくなると思います。クラスごとの一文は、実装を…

Apache Beam の Side input パターンで LEFT JOIN する

Apache Beam で複数のデータソースから取得したデータを、SQL でいう LEFT JOIN する方法を試しました。 一方がストリーミングデータで、もう一方がデータウェアハウスから取得したデータといった場面を想定しています。 どうやるのか調べたところ、1つのパ…

Poetry dev-dependencies が v1.2 で deprecated になっていたのでこれからは group を使う

いつの間にか、poetry add --dev や poetry install --no-dev などで指定する開発用パッケージを示す dev-dependencies が Deprecated になっていることに気づきました。 python-poetry.org 1.2 より前は [tool.poetry.dev-dependencies] という TOML テーブ…

BigQuery の全テーブルのレコード件数やサイズを保存して、前日からの変化を確認する

GCP

BigQuery のテーブル別レコード数を履歴として保存して、その変化を見ることで期待した操作が行われているか(逆に、意図しない操作をしていないか)をチェックする方法を考えました。 全体的にどういう変化が起きたのかをざっくり確認したい、というのが目的…

Apache Beam Python SDK でパイプラインのテストコードを書く

Apache Beam SDK には testing パッケージが用意されており、これを使うことで Beam パイプラインに対するテストコードを書けます。 この記事では、Python SDK でのテストを試してわかったことをまとめています。誤りがありましたらご指摘いただけると嬉しい…

Debezium Server による Change Data Capture: from MySQL to Google Cloud Pub/Sub

GCP

この記事は、datatech-jp Advent Calendar 2022 の19日目の記事です。 @tosh2230 と申します。以前から気になっていた Debezium Server による Change Data Capture(CDC) をやってみました。 具体的には、MySQL のレコードに変更が加わった際に、その情報を …

aws batch list-jobs コマンドでのフィルタリング方法

AWS

AWS Batch Job のステータスを AWS CLI で確認する際のフィルタリング方法を調べました。 list-jobs コマンド ジョブのステータスを確認するには、aws batch list-jobs コマンドを使います。 docs.aws.amazon.com aws batch list-jobs --profile $PROFILE --…

Stairlight の運用方法を考える - 2022年、夏

データリネージツール Stairlight の運用方法について、こうするとよいのでは?と検討したことを書きます。 運用にあたっての課題 いま見えている範囲では2つあります。 設定ファイルを更新するタイミング リネージ抽出結果だけではその鮮度がわからない 設…

Fundamentals of Data Engineering を読んで

オライリーから出版された Fundamentals of Data Engineering を読みましたので、感想を書きます。 書籍情報 Fundamentals of Data Engineering by Joe Reis, Matt Housley Released June 2022 Publisher(s): O'Reilly Media, Inc. ISBN: 9781098108304 www.…

poetry publish コマンドで keyring の ModuleNotFoundError が起きたときの対応メモ

Poetry は依存するパッケージの管理だけでなく、PyPI に公開するのも簡単にできるのでとても便利です。 そんな中、poetry publish コマンドでエラーが発生するようになってしまいました。暫定対応により、現在は publish できています。そのときの対応メモが…

AWS Database Migration Service による Change Data Capture: 後編

Amazon RDS から Google BigQuery への CDC 後編です。後編では、S3 に格納された Parquet ファイルのデータを BigQuery に登録する部分を扱います。 構成図 前編はこちらをご覧ください。 ts223.hatenablog.com ソースコードは、前回同様にこちらで公開して…

AWS Database Migration Service による Change Data Capture: 前編

AWS

AWS Database Migration Service (以下、DMS) で Change Data Capture(CDC) を試してみました。 目的 構成 DMS のしくみ DMS の概要図 MigrationType 環境構築のポイント RDS パラメータグループ RDS への接続情報は SecretsManager に入れると便利 Replicat…

Stairlight v0.3.0: データソースとして Redash に対応しました

データリネージツール Stairlight の v0.3.0 を公開しました。 Stairlight とは テーブルレベルのデータリネージツールです。詳しくはこちらの記事をご参照ください。 ts223.hatenablog.com ts223.hatenablog.com 主なアップデート データソースとして Redas…

AWSのインターフェイス型VPCエンドポイントはAZごとに1つだけ設定できる

AWS

AWS のインターフェイス型 VPC エンドポイント (以下、Interface endpoint)を作成する際に、気になったことがあったのでまとめます。 サブネットの設定でエラーになった 例として、ECR エンドポイントを作成する CloudFormation のコードを挙げます。 ECREnd…

Stairlight v0.2.0 を公開しました

データリネージツール Stairlight の v0.2.0 を公開しました。 Stairlight とは テーブルレベルのデータリネージツールです。詳しくはこちらの記事をご参照ください。 ts223.hatenablog.com ts223.hatenablog.com 主なアップデート ラベル機能 同じテーブル…

データリネージツール Stairlight でテーブルの依存関係をグラフにする

この記事は、datatech-jp Advent Calendar 2021 の6日目の記事です。 こんにちは、GMOペパボ株式会社でデータエンジニアをしています、@tosh2230 と申します。 5日目は よしむらさんのデータマネジメント成熟度アセスメント、データ利活用機運アセスメントを…

workload identity federation での認証は Cloud SDK CLI に制限がある

GCP

結論 2021/11/22 現在、google-github-actions/auth など GCP の workload identity federation ログインで利用できるのは gcloud コマンドのみで、gsutil や bq は対象外になっています。 確認したこと この制限に気づかずに、GitHub Actions にて google-g…

Stairlight というデータリネージツールをつくった

Stairlight*1 という、テーブルレベルのデータリネージができるツールをつくりましたので、その特徴や使い方について書きます。 github.com 背景 ETL(Extract, Transform, Load) と呼ばれる一連のデータ加工プロセスにおいて、バッチ処理での Transform は、…

"Loggingモジュールではじめるログ出力入門" で PyCon JP 2021 に登壇した

この度、PyCon JP 2021 で発表をするという機会に恵まれました。 発表内容やプロポーザルを出した動機、感想と振り返り、そして多方面への謝辞を述べます。 発表資料 ソースコード 発表内容 プロポーザルを出した動機 感想と振り返り 謝辞 @amedama さま、@n…

Google Cloud Professional Data Engineer の資格を取得した

ここ数年、毎年ひとつ以上は何かの資格を取ることを目安に動いているのですが、今年は Google Cloud の Professional Data Engineer にしました。 2021/9/19 に受験し、翌日の 2021/9/20 に認定を受けました。資格の有効期間は 2年間です。再受験のときには…

AWS CloudFormationスタックのドリフトを検出してSlackに通知する

AWS

AWS CloudFormation(以下、Cfn) のスタックドリフトを検出して、Slackに通知してみました。 ドリフト検出とは Cfn で定義したスタック内のリソースについて、定義した内容から変更が加わっていないかをチェックする機能です。Cfn で管理していることを知らず…

Python logging levelを示す数値とその名称はlogging.getLevelNameで相互変換できる

結論 Python の logging.getLevelName 関数で、ログレベルを表す数値とその名称に当たる文字列を相互変換することができます。関数名の印象だと 数値 -> 名称 の一方向っぽいのですが 、実は双方向で変換できます。 $ python Python 3.8.11 (default, Jul 31…

Streamlit on Cloud Run with Identity-Aware Proxy (IAP)

GCP

タイトルのとおり、Cloud Run で Streamlit を動かしてみました。また、特定の人のみがアクセスできるように、Identity-Aware Proxy(IAP) での保護を試しましたので、その設定やコードを紹介します。 Cloud Run で動かすのはすぐにできたのですが、複数の St…

Cloud Dataflow と Cloud Pub/Sub で Exactly-once なストリーミングインサートを

[前回の記事](https://ts223.hatenablog.com/entry/dataflow-beam) では、Cloud Dataflow と Apache Beam に入門しました。その続きとして、今回は BigQuery に対してストリーミングインサートをしてみます。また、Cloud Pub/Sub と組み合わせることで Exact…

Cloud Dataflow と Apache Beam に入門した

BigQuery にストリーミングインサートしたい気持ちが高まってきて Cloud Dataflow と Apache Beam に入門しました。Cloud Pub/Sub -> Cloud Dataflow -> BigQuery のルートで取り込むにあたり、事前知識を得ることが目的です。 Apache Beam 特徴 Tour of Bea…

NaN というSQL演算結果

はじめに 先日、BigQueryで「SUM関数の演算対象にNULLが含まれるときに結果はどうなるか?」という話になって、NULLになるんじゃないかな?とその時思ったけど、リファレンスを見たら普通に違った。 標準 SQL の集計関数 | BigQuery | Google Cloud NULL 以…