Atsushi2022の日記

データエンジニアリングに関連する記事を投稿してます

BigQueryのFORループでデータセットの全テーブルに対してクエリを投げる

複数のテーブルのレコード件数を表にまとめたいことがたまにある。 そういう時はFORループを使用して、count(*)した結果を一時テーブルに入れて確認したりする。 DECLARE dataset STRING DEFAULT "test_dataset"; CREATE OR REPLACE TEMP TABLE record_count…

BigQuery INFORMATION_SCHEMAのアクセス権限

INFORMATION_SCHEMAのビューを使用して、テーブルやカラムの情報を取得して、テーブル作成などに使用することが多いけれど、INFORMATION_SCHEMAビューにアクセスするのに権限が必要なことは知らなかった。 権限を持っていないと、SELECTしても次のようなエラ…

PythonでのEnum

標準ライブラリにあるEnumクラスにより、Enumを使用することができる。 列挙型は定数を表すために使われるため、Enumのメンバの名前は大文字にすることが推奨される。 次のコードで挙動を確認することができる。詳細については列挙型 HOWTOにわかりやすくま…

管理すべきメタデータ、データ品質テスト

管理すべきメタデータ メタデータはビジネスメタデータ、テクニカルメタデータ、オペレーションメタデータの3種類に分けられる。 具体的には次のようなデータがある。 ビジネスメタデータ テーブルのオーナー テーブルのパーティションに使用されるカラム カ…

BigQuery関連で面白かったブログ・動画 4選

1. I spent 3 hours figuring out how BigQuery inserts, deletes and updates data internally. Here’s what I found. ライトノベルのようなタイトルですね。BigQuery内部でどのようにファイルを管理しているかキレイな図で紹介してくれてます。 データを挿…

BigQueryでのNULLのソート

BigQueryでORDER BY句を使用する場合、デフォルトのNULLの順序はASCかDESCで異なる。ASCの場合はNULLが最初に来るし、DESCの場合はNULLが最後に来る。 NULLS FIRST is applied by default if the sort order is ascending. NULLS LAST is applied by default…

MySQLが遅い時に参考にしたサイト一覧

概要 EmbulkでMySQLからデータを抽出しようとしたら遅かったので、関連となるトピックを色々調べた。とりあえず参考リンクだけ貼っておく。 クエリ処理の流れ (Oracle) SQLの処理 (SQL Server) SELECT ステートメントを処理する <非公式> MySQL Logical Arch…

Dataplexで外部キー制約を満たしているかのデータ品質チェック

BigQueryの外部キー制約は強制適用されないため、外部キー参照先の値(またはNULLのみ)しか入らないようにユーザー側で管理する必要がある。 そこでDataplexを使用して定期的に外部キー制約に沿った値になっているか確認できないかと考えた。 調べたところ…

BigQueryのPRIMARY KEYは強制適用されない

まったく知らなかったけど、BigQueryの主キー/外部キー制約は強制適用されない。。。 これは知らないと割と事故りそう。 わい)主キー設定したし、NULLだったらエラーになってくれるよねー。NULLが入らないから安心だな~ BigQuery)NULLでもオレ、全然いい…

BigQueryで全行削除するときはDELETEを使う

BigQueryでは全行削除するときはDELETEを使った方が良い。 Timetravelで復元もできるし、DELETEより早いし、お金もかからない。 BigQuery公式 When performing a DELETE operation to remove all the rows from a table, use TRUNCATE TABLE statement inste…

SQLでの計算量(Big O)

O(1) オーダー テーブルから任意の1行を取り出す SELECT TOP 1 * FROM table; O(log N) オーダー インデックスが張られた列に対してのWHERE句による抽出 O(log N)なので、テーブルサイズが大きくなっても、あまり時間計算量は増えない O(N) オーダー 以下の…

BigQuery、比較演算子でNULLを比較

BigQueryで、比較演算子で比較される対象のどちらかがNULLだと結果はNULLになる。以下のクエリの結果はどちらもNULLになる。 SELECT CAST(NULL AS INT64) < 1; SELECT CAST(NULL AS INT64) = CAST(NULL AS INT64); 以下の例だとNULL行と今日の日付の2行が存…

BigQueryでのDELETE-INSERTは、MERGE ~ ON FALSEで行う

BigQueryでDELETE-INSERTしたい場合、 MERGE ~ ON FALSE WHEN NOT MATCHED BY SOURCE THEN DELETE WHEN NOT MATCHED BY TARGET THEN INSERT ROW を使用すると良い。DELETE-INSERTを行えるうえ、動作も早いらしい。 ON FALSEとすることで、NOT MATCHED BY SOU…

SQLのBig Oに関するブログ記事

medium.com www.datacamp.com www.kdnuggets.com www.kdnuggets.com

BigQueryの外部テーブルでの allow_quoted_newlines オプション

BigQueryの外部テーブルでの allow_quoted_newlines オプション BigQuery で CSV ファイルから外部テーブルを作成する場合は、オプションが不足していないか確認してください。 ある日、元の CSV ファイルのフィールドの 1 つに引用符で囲まれた改行文字が含…

IntelliJの初期設定

概要 IntelliJの設定項目を忘備としてメモしておく。 主に使うのはTerraformとPythonなのでそのあたりの設定。 Git Toolboxが超便利。 設定項目 Plugins File Watchers Git ToolBox Terraform and HCL File Watchersへの設定 terraform fmt flake8(カスタム…

IntelliJでの複数カーソルによる文字列選択

概要 IntelliJで複数カーソルの使用方法を調べてみた。特に、覚えておくと重宝しそうなものに絞ってメモしておく。 覚えておきたい複数カーソル操作 キーボードを使用して現在のカーソルの上または下にカーソルを追加 Shiftを押しながら上下↑↓キーを押す そ…

【Linux Tips】コマンドの実行結果を日時文字列ファイルに出力

コマンドの出力結果を日時文字列ファイルに出力するのが面倒だったので、エイリアスを登録して省力化する。 エイリアスの設定 $ alias logd='touch log.`date +%Y%m%d%H%M%S` && ls log.`date +%Y%m%d%H%M%S`' ↑のエイリアスは、日時文字列ファイルをtouchで…

【Linux Tips】色々メモ

実行権限がないファイルの実行 実行権限がないファイルでも読み取り権限があれば、bashやsource等の引数にすれば実行できちゃう。 $ id uid=1001(test01) gid=1001(test01) groups=1001(test01) $ ls -l test.sh -rw-rw-r-- 1 test01 test01 5 Dec 9 23:24 t…

Linux iptablels

Dockerコンテナ外部からの通信制御はiptablesを使用して行う。(参考) Dockerコンテナ外部からの通信制御について理解したいので、まずiptablesについて復習していきたい。 iptablesはLinuxでパケットフィルタリングを行うツール。iptablesには後継のツール…

iptablesの後継 nftables

nftablesはパケットフィルタリングツールで、iptables、ip6tablesなどの後継。 簡単なユースケースではfirewalldを使用するが、複雑なケースやネットワーク全体に対する設定はnftablesを使用する。今後はiptablesの代わりに、nftablesの試用が推奨される。 …

Red Hat カーネルのアップグレード

カーネルとはハードウェアとソフトウェアアプリケーションの仲立ち(インターフェイス)をするLinux OSのコアの部分。 Red Hatだと、カーネルはRPM形式でパッケージ化されており、yum(ないし、dnf)で簡単にアップグレードできる。 カーネルRPMパッケージは…

glibcとは?

glibcはシステムコールといったLinuxシステムの根幹をなすプログラムのライブラリ。 「GNU Project」による標準ライブラリ「libc」の実装。C言語の標準ライブラリ名をlibc(リブシー)といい、多くのプログラムで共通して使われるような、システムコールを始…

とりあえずGCEでLinuxマシンを作成する手順

GCP

手順 APIを有効にしておく(特にCloud Identity-Aware Proxy APIは忘れがち) VPC network作成 GCE作成(ネットワークタグを付与) ファイアウォールでCloud Identity-Aware Proxyからのアクセス(35.235.240.0/20)とクライアントからのアクセスを許可(22…

Linuxにおけるリポジトリ、yumあるいはdnf

Linuxにおいてリポジトリとは、ダウンロードのためにパッケージ(.rpm, .deb)などを配置してくれているサーバのこと。 例えば、ニフクラさんは、rhui-rhel-8-for-x86_64-baseos-rhui-rpmsやrhui-rhel-8-for-x86_64-appstream-rhui-rpmsというリポジトリ(サー…

Pythonでのオブジェクト指向プログラミング

概要 Microsoft LearnにPythonでのオブジェクト指向プログラミングがわかりやすくまとめられていたので、概要をメモしておく。 https://learn.microsoft.com/ja-jp/training/modules/python-object-oriented-programming/ Python を使用したオブジェクト指向…

UDPパケット受信時の一般的な処理実装

◆外部公開しているシステムがUDPパケットを受信した場合 パケットを無視する。なにもしない。ログも吐かない。 ログを吐くとディスクをひっ迫させる攻撃を受けるリスクがある。 ◆外部公開しないシステムがUDPパケットを受信した場合パケットは無視するが、ig…

Pytestを試してみる

Pytestの概要 pytestはPython用のソフトウェアフレームワーク。記述したテストを文字列で発見して、自動的にテストを行ってくれる。Circle CIなどのCIツールと組み合わせることで、テスト自動化ができる。 pytestはpip install pytestでインストールする。 i…

Airflowを試してみる

Airflowの要点っぽいところ AirflowではワークフローをDAGと呼ぶ。DAGは複数のTaskからなる。 Taskが様々な処理を実行し、DAGが各Taskの実行順序を定義する。 TaskにはOperartorやSensorといった種類がある。 なので、関係性は次のようなイメージ。 DAG Task…

ncコマンドでUDPパケットを送信する

ncコマンドでUDPで送信するには、-uオプションを使用する。 これを知らずにTCPで送信し続けて、なぜ届かないの(?)となってた。 とはいえ、nc -vuz [宛先IPアドレス] [ポート番号]とかで、宛先IPアドレスへの到達性確認しようとしてもUDPパケットなので、パケ…