BigQueryは、SELECT DISTINCT
がない。
最後にloadした行だけを取得する
前処理
BigQuery読み込み用のCSVファイルへ書き出すときに、
-
TIMESTAMP
値を_insert
に入れておく。 CSVファイル1行ごとにTIMESTAMP
値を取ると遅そうだしぶつかりそうなので、CSVファイルごとに1つでいい。 - CSVファイルの何行目か(CSVファイルreaderのline num値とか)を
_line_num
に入れておく。 - App EngineのTask Queueで、並列度1な直列化キューを作り、そこで処理する。
としておく。
- cp932なCSVをUTF-8に変換するときなどに、ついでにやっておく。
Query
SELECT key1 [, key2, ...]
,FIRST(field1) AS field1 [, FIRST(field2) AS field2, ...]
FROM ( SELECT *
FROM table1[, table2, ...]
ORDER BY _insert DESC, _line_num DESC)
GROUP BY key1 [, key2, ...]
- サブクエリで、対象テーブルを全部UNIONする。
-
key1 [, key2, ...]
は、主keyまたは複合主key。 -
GROUP BY
で、keyフィールドにグループ化する。 - keyフィールド以外は、
FIRST
で取り出す。 - 集計フィールドは、
AS field1
としないと自動的にf0__...
のようになる。 -
ORDER BY ... DESC
してからFIRST
で取り出したほうが速そうなイメージであるが、本当のところは測っていない。
BigQueryの仕様
- table unionは1,000まで。