【Terraform x Snowflake】当使用Terraform定义外部表时,如何指定位置(location)的方法
结论
从Terraform的Snowflake提供程序的外部表中,指定location是“必需的”,但是由于文档中没有明确的说明方式,因此不太清楚。不过,你可以按照以下方式来写。
resource "snowflake_external_table" "external_table" {
database = "MY_DATABASE"
schema = "MY_SCHEMA"
name = "MY_EXTERNAL_TABLE"
location = "@MY_DATABASE.MY_SCHEMA.MY_EXTERNAL_STAGE/path_to_file/"
file_format = "TYPE = PARQUET"
column {
name = "ID"
type = "VARCHAR"
}
column {
name = "DATA"
type = "VARCHAR"
}
}
背景 – 与母语为中文的用户进行重新表述只需要一个选择。
因为之前不知道在Terraform中如何描述location,所以参考Snowflake官方文档中的外部表描述进行尝试,在Terraform中编写了这部分内容。
那个结果是错误的。看起来写法可能有所不同。
尽管有多种写法可以让其识别相同的位置(外部舞台),但由于很难找到正确答案,所以我决定将其记录下来。
抱怨
在公式文件中未提及的情况。
而且,在Terraform上和Snowflake(SQL)上的记录方式也不同,这更加麻烦。
-
- ステージを参照する書き方のバリエーション
@指定の省略表記
# SnowflakeのSQLではOK、TerraformではNGな書き方
@MY_EXTERNAL_STAGE
これがTerraformで通らないのは、納得がいかない。
なぜなら、外部テーブルを定義する際はdatabaseとschemaも必須パラメータであり、これら指定する時点でどのスキーマオブジェクトであるのかは(=どのスキーマ配下に存在する外部ステージなのか)は明確であるはずなので。
だが、Terraformでは認識できない仕様らしいので仕方ない。
@を付けない完全修飾表記
# SnowflakeのSQLではOK、TerraformではNGな書き方
MY_DATABASE.MY_SCHEMA.MY_EXTERNAL_STAGE
@指定の完全修飾表記
# これで通るんかい…
@MY_DATABASE.MY_SCHEMA.MY_EXTERNAL_STAGE
Snowflake上ではまずこのような指定はしないんじゃなかろうか。
— SQLワークシートで書く時は、大体こうやるはず
USE MY_DATABASE.MY_SCHEMA;
CREATE EXTERNAL TABLE MY_EXTERNAL_TABLE(
— 中略
LOCATION=@MY_EXTERNAL_STAGE/path_to_file/
FILE_FORMAT = (TYPE = PARQUET)
— 中略
;
这个东西实在是搞不懂啊…
(Note: This is the translation of the requested paraphrase from Japanese to Chinese. The provided phrase in Japanese does not have a direct equivalent in Chinese, so the closest approximation is given here.)