INTO 句は、クエリの結果を指定されたメジャーに書き込みます。
構文
SELECT 句 INTO <measurement_name> FROM 句 [WHERE 句] [GROUP BY 句]ターゲットメジャーのフォーマット
INTO 句では、送信先メジャーを指定するための以下の 4 種類のフォーマットがサポートされています。
| フォーマット | 動作 |
|---|---|
INTO <measurement_name> | 指定された名前のメジャーに書き込みます。CLI では、USE 文で指定されたデータベースと DEFAULT 保持ポリシーが使用されます。HTTP API では、db パラメーターで指定されたデータベースと DEFAULT 保持ポリシーが使用されます。 |
INTO <database_name>.<retention_policy_name>.<measurement_name> | 完全修飾されたメジャー(例:`database.retention_policy.measurement`)に書き込みます。データベース名および保持ポリシー名の両方が明示的に指定されている必要があります。 |
INTO <database_name>..<measurement_name> | 指定されたデータベース内の指定された名前のメジャーに、DEFAULT 保持ポリシーを使用して書き込みます。 |
INTO <database_name>.<retention_policy_name>.:MEASUREMENT FROM /<正規表現>/ | FROM 句内の正規表現に一致するメジャーに書き込みます。:MEASUREMENT はバックリファレンスであり、各ソースメジャーの名前をターゲットデータベース内にそのまま保持します。 |
例
クエリ結果をメジャーに書き込む
> SELECT "water_level" INTO "h2o_feet_copy_1" FROM "h2o_feet" WHERE "location" = 'coyote_creek'
name: result
------------
time written
1970-01-01T00:00:00Z 7604
> SELECT * FROM "h2o_feet_copy_1"
name: h2o_feet_copy_1
---------------------
time water_level
2015-08-18T00:00:00Z 8.12
[...]
2015-09-18T16:48:00Z 4この操作により、water_level フィールドの値が h2o_feet メジャーから、新しく作成された h2o_feet_copy_1 メジャーへ 7604 ポイント書き込まれます。結果行に表示される 1970-01-01T00:00:00Z のタイムスタンプはエポック 0 を表し、TSDB for InfluxDB® では null タイムスタンプとして扱われます(実際の書き込み時刻を示すものではありません)。
HTTP API を使用する場合、rp パラメーターで指定された保持ポリシーが適用されます。rp パラメーターを省略した場合は、DEFAULT 保持ポリシーに書き込まれます。
完全修飾されたメジャーにクエリ結果を書き込む
> SELECT "water_level" INTO "where_else"."autogen"."h2o_feet_copy_2" FROM "h2o_feet" WHERE "location" = 'coyote_creek'
name: result
------------
time written
1970-01-01T00:00:00Z 7604
> SELECT * FROM "where_else"."autogen"."h2o_feet_copy_2"
name: h2o_feet_copy_2
---------------------
time water_level
2015-08-18T00:00:00Z 8.12
[...]
2015-09-18T16:48:00Z 4この操作により、7604 ポイントが h2o_feet_copy_2 メジャーへ書き込まれ、その送信先は where_else データベースの autogen 保持ポリシー下となります。クエリを実行する前に、where_else データベースおよび autogen 保持ポリシーが事前に存在している必要があります。詳細については、「データベース管理」トピックをご参照ください。
クエリ結果をダウンサンプリングしてメジャーに書き込む
> SELECT MEAN("water_level") INTO "all_my_averages" FROM "h2o_feet" WHERE "location" = 'coyote_creek' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m)
name: result
------------
time written
1970-01-01T00:00:00Z 3
> SELECT * FROM "all_my_averages"
name: all_my_averages
---------------------
time mean
2015-08-18T00:00:00Z 8.0625
2015-08-18T00:12:00Z 7.8245
2015-08-18T00:24:00Z 7.5675この例では、MEAN() 関数と GROUP BY time(12m) を併用して、water_level を 12 分間隔で集計し、その結果を all_my_averages へ 3 ポイント書き込みます。細かい粒度のデータをクエリし、より粗い間隔で集計結果を保存する処理(ダウンサンプリング)は、INTO 句の主要な利用シーンです。
バックリファレンスを用いた複数メジャーへのダウンサンプリング
> SELECT MEAN(*) INTO "where_else"."autogen".:MEASUREMENT FROM /.*/ WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:06:00Z' GROUP BY time(12m)
name: result
time written
---- -------
1970-01-01T00:00:00Z 5
> SELECT * FROM "where_else"."autogen"./.*/
name: average_temperature
time mean_degrees mean_index mean_pH mean_water_level
---- ------------ ---------- ------- ----------------
2015-08-18T00:00:00Z 78.5
name: h2o_feet
time mean_degrees mean_index mean_pH mean_water_level
---- ------------ ---------- ------- ----------------
2015-08-18T00:00:00Z 5.07625
name: h2o_pH
time mean_degrees mean_index mean_pH mean_water_level
---- ------------ ---------- ------- ----------------
2015-08-18T00:00:00Z 6.75
name: h2o_quality
time mean_degrees mean_index mean_pH mean_water_level
---- ------------ ---------- ------- ----------------
2015-08-18T00:00:00Z 51.75
name: h2o_temperature
time mean_degrees mean_index mean_pH mean_water_level
---- ------------ ---------- ------- ----------------
2015-08-18T00:00:00Z 63.75:MEASUREMENT バックリファレンスにより、各ソースメジャーの名前が where_else.autogen 内の同名メジャーへマップされます。これにより、5 つのメジャー全体で合計 5 ポイントが書き込まれます。クエリを実行する前に、where_else データベースおよび autogen 保持ポリシーが存在している必要があります。
データベース間でのデータ移行
TSDB for InfluxDB® では、データベース名を変更することはできません。データベース名を実質的に変更するには、INTO 句と :MEASUREMENT バックリファレンスを用いて、データを新しいデータベースへ移行します。
> SELECT * INTO "copy_NOAA_water_database"."autogen".:MEASUREMENT FROM "NOAA_water_database"."autogen"./.*/ GROUP BY *
name: result
time written
---- -------
0 76290これは、NOAA_water_database.autogen から copy_NOAA_water_database.autogen へすべてのデータをコピーします。このとき、メジャー名は保持され、GROUP BY * のため、すべてのタグが送信先でタグとして保持されます。GROUP BY * を使用しない場合、ソースのタグは送信先のフィールドになります(下記の「欠落しているデータ」をご参照ください)。
大規模データセットの移行
大規模なデータ移行を行う場合、メモリ不足(OOM)エラーを回避するために、INTO クエリをメジャーごとに分けて実行し、WHERE 句でタイムウィンドウを指定してください。
SELECT *
INTO <destination_database>.<retention_policy_name>.<measurement_name>
FROM <source_database>.<retention_policy_name>.<measurement_name>
WHERE time > now() - 100w AND time < now() - 90w GROUP BY *
SELECT *
INTO <destination_database>.<retention_policy_name>.<measurement_name>
FROM <source_database>.<retention_policy_name>.<measurement_name>
WHERE time > now() - 90w AND time < now() - 80w GROUP BY *
SELECT *
INTO <destination_database>.<retention_policy_name>.<measurement_name>
FROM <source_database>.<retention_policy_name>.<measurement_name>
WHERE time > now() - 80w AND time < now() - 70w GROUP BY *よくある問題
データの欠落
SELECT 句でタグキーを含む場合、INTO クエリはそれらのタグを送信先メジャーのフィールドとして変換します。フィールドはタグとは異なり、ポイントを区別しないため、異なるタグ値を持つ本来は一意であったポイントが上書きされる可能性があります。ただし、TOP() 関数または BOTTOM() 関数を使用するクエリでは、この動作は適用されません。
以下の例では、GROUP BY * を省略した場合のデータ損失の様子を示しています。ソースとなる french_bulldogs の初期データ:
time color name
2016-05-25T00:05:00Z peach nugget
2016-05-25T00:05:00Z grey rumple
2016-05-25T00:10:00Z black princeGROUP BY * を指定しない場合、color はフィールドとなり、同一タイムスタンプを持つ 2 つのポイントが存在するため、nugget が上書きされます。
SELECT * INTO "all_dogs" FROM "french_bulldogs"結果 — nugget が失われています:
time color name
2016-05-25T00:05:00Z grey rumple
2016-05-25T00:10:00Z black princeGROUP BY * を指定すると、color はタグとして保持され、すべてのポイントが正しく保存されます。
SELECT "name" INTO "all_dogs" FROM "french_bulldogs" GROUP BY *結果 — 3 つのポイントすべてが保持されています:
time color name
2016-05-25T00:05:00Z peach nugget
2016-05-25T00:05:00Z grey rumple
2016-05-25T00:10:00Z black prince送信先でタグをタグとして保持するには、GROUP BY *(または GROUP BY <tag_key>)を INTO クエリに追加してください。
INTO 句によるクエリの自動化
上記の例では、INTO クエリを手動で実行する方法を示しています。リアルタイムデータに対して(定期的なダウンサンプリングを含む)これらのクエリを自動化するには、継続的クエリ(Continuous Query)を使用します。以下の例では、water_level を 30 分間隔の平均値に集計し、その結果を別の保持ポリシーへ書き込む継続的クエリを作成しています。
CREATE CONTINUOUS QUERY "cq_30m" ON "my_database" BEGIN
SELECT MEAN("water_level")
INTO "long_term"."autogen"."water_level_30m"
FROM "h2o_feet"
GROUP BY time(30m)
END保持ポリシーの設定を含む完全なワークフローについては、継続的クエリに関するドキュメントをご参照ください。
InfluxDB® は InfluxData 社の登録商標であり、TSDB for InfluxDB® とは関係がなく、また推奨もしていません。