JDK のディストリビューションがまたいろいろ変わってた
久々に sdk ls java したら、いつも使ってる adopt が無くなってて、見慣れないやつらが増えてた。
adopt は eclipse 財団傘下になって adoptium に名前が変わったらしい。ディストリビューションの名前は temurin になったらしい。 adoptopenjdk.net
temrin 使っとくのがよいのかな。 whichjdk.com
今日のBQ謎仕様 : require_partition_filter = true なテーブル同士をJOINしつつフルスキャンしたい時
パーティショニングしていて、require_partition_filter = true のテーブル同士をJOINする場合を考える。 そのようなテーブルをフルスキャンする場合、
WHERE partitioning_field IS NOT NULL
ってやるが、これは JOIN するテーブルが一つまでだと動くが、2つ以上のテーブルを JOIN しようとするとエラーになる模様。 つまり、
FROM tbl1 LEFT JOIN tbl2 ON (...) WHERE tbl1.partitioning_field IS NOT NULL AND tbl2.partitioning_field IS NOT NULL
は動くけど、
FROM tbl1 LEFT JOIN tbl2 ON (...) LEFT JOIN tbl3 ON (...) WHERE tbl1.partitioning_field IS NOT NULL AND tbl2.partitioning_field IS NOT NULL AND tbl3.partitioning_field IS NOT NULL
は「tbl3 は partitioning_field で絞んないとクエリできまへん」と怒られる。理不尽...
こういう場合は、WITH句で各テーブルを WHERE partitioning_field IS NOT NULL してから JOIN する必要がある。(メンドイ...)
なお、パーティションを明示的に絞れば動くようだ。 つまりこれは動く。
FROM tbl1 LEFT JOIN tbl2 ON (...) LEFT JOIN tbl3 ON (...) WHERE tbl1.partitioning_field = "2021-01-01" AND tbl2.partitioning_field = "2021-01-01" AND tbl3.partitioning_field = "2021-01-01"
2022-01-30 追記
ON 句でパーティションを絞ると動く。
つまり、これは動く。
FROM tbl1 LEFT JOIN tbl2 ON (... AND tbl2.partitioning_field IS NOT NULL) LEFT JOIN tbl3 ON (... AND tbl3.partitioning_field IS NOT NULL) WHERE tbl1.partitioning_field IS NOT NULL
GCP の環境変数
GCP のデフォルト・プロジェクトを設定する方法に、環境変数を設定する方法があるが、同じような役割っぽい環境変数がいくつかある。
GOOGLE_CLOUD_PROJECT
CLOUDSDK_CORE_PROJECT
GCP_PROJECT
GCLOUD_PROJECT
GCLOUD_PROJECT は deprecated のようだ。
GCLOUD_PROJECT is deprecared in favor of GOOGLE_CLOUD_PROJECT + avoid using it at all · Issue #251 · GoogleCloudPlatform/nodejs-getting-started · GitHub
GOOGLE_CLOUD_PROJECT
と CLOUDSDK_CORE_PROJECT
を混ぜて使っちゃってハマったことがあった。
bq コマンドは GOOGLE_CLOUD_PROJECT
より CLOUDSDK_CORE_PROJECT
を優先するっぽいのだが、google-cloud-ruby は逆のようだ。
CLOUDSDK_CORE_PROJECT
を設定すると、ローカルでは思った通りに動いたのに、サーバ上ではうまく動かなかったことがあった。よくよく調べたら、サーバ上では GOOGLE_CLOUD_PROJECT
も設定しており、google-cloud-ruby がそっちに従ってた。
混乱するので混ぜるな危険! しかし、環境変数を乱立させないでほしい...
2022-01-30 追記
どうも勘違いしていた...
gcloud, bq
GOOGLE_CLOUD_PROJECT
は無視している?
CLOUDSDK_CORE_PROJECT
は読んでる。gcloud config set
より優先される。
google-cloud-ruby, google-cloud-python
GOOGLE_CLOUD_PROJECT
もCLOUDSDK_CORE_PROJECT
も両方読む。
両方設定されている場合はGOOGLE_CLOUD_PROJECT
を優先する。
ちなみにGCP_PROJECT
については調べておらず。(cloud functions とかで使われている?)
kindle paper white に pdf を送る方法
ruby の google-cloud-bigquery は ALTER TABLE SET OPTIONS に対応してない?
Google::Cloud::Bigquery.new.query( <<~QUERY ALTER TABLE dataset.table SET OPTIONS (expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)) QUERY )
このコード、動かないっぽい...
Library/Ruby/Gems/2.6.0/gems/google-cloud-bigquery-1.31.0/lib/google/cloud/bigquery/data.rb:506:in `from_gapi_json': undefined method `fields' for nil:NilClass (NoMethodError) from /Library/Ruby/Gems/2.6.0/gems/google-cloud-bigquery-1.31.0/lib/google/cloud/bigquery/query_job.rb:707:in `data' from /Library/Ruby/Gems/2.6.0/gems/google-cloud-bigquery-1.31.0/lib/google/cloud/bigquery/project.rb:886:in `query'
のような例外が出る。
ruby ライブラリが SET OPTIONS に対応してないっぽい... (CREATE VIEW は動いた)
google-cloud-bigquery (1.31.0) で確認。
digdag の -X オプション
jcommander の dynamic option というやつらしい。 https://github.com/treasure-data/digdag/blob/v0.10.0/digdag-cli/src/main/java/io/digdag/cli/Command.java#L54 しかし、どこで参照しているのか分からなかった...
digdag 手動実行時の session time、last_session_time
workflow 画面の 「RUN」をクリックした場合の挙動
2021-01-10 に実行したとする。
cron を使った場合
schedule: cron>: 10 1 * * *
1時10分より前に実行した場合
session_time = クリックした日時 last_session_time= 2021-01-09 01:10:00
1時10分より後に実行した場合
session_time = クリックした日時 last_session_time= 2021-01-10 01:10:00
daily を使った場合
schedule: daily>: 01:10:00
1/10に実行したら、何時に実行しても以下の通り。
session_time = クリックした日時 last_session_time= 2021-01-10 01:10:00
(2023/04/27 追記) なお、上記の挙動は server mode の時の挙動であり、local mode の時は挙動が異なるようだ...