来自 s3 下的 .csv 文件的雪花外部 table
snowflake external table from .csv file under s3
假设我有这样的 .csv 文件:
event,user
1,123
2,321
此 .csv 文件位于 s3 下。
运行 以下 sql 创建一个外部 table(使用 @TEST_STAGE 创建并具有正确的 s3 路径):
CREATE OR REPLACE EXTERNAL TABLE TEST_CSV_TABLE1(
event_id VARCHAR AS (value:::varchar),
user_id VARCHAR AS (value:::varchar)
)
WITH LOCATION = @TEST_STAGE
FILE_FORMAT = (TYPE = CSV FIELD_DELIMITER = ',' SKIP_HEADER = 1);
查询以下 table 结果如下:
|-----|----------------------------|----------|---------|
| Row | VALUE | EVENT_ID | USER_ID |
|-----|----------------------------|----------|---------|
| 1 | { "c1": "1", "c2": "123" } | NULL | NULL |
|-----|----------------------------|----------|---------|
| 2 | { "c1": "2", "c2": "321" } | NULL | NULL |
|-----|----------------------------|----------|---------|
但是,如果我只是创建一个 table 作为
CREATE OR REPLACE TABLE TEST_CSV_TABLE2(
event_id VARCHAR,
user_id VARCHAR
);
并像这样加载相同的文件:
COPY INTO TEST_CSV_TABLE2 FROM @TEST_STAGE
FILES = ('test.csv')
FILE_FORMAT = (TYPE = CSV FIELD_DELIMITER = ',' SKIP_HEADER = 1);
甚至喜欢:
COPY INTO TEST_CSV_TABLE2
FROM (
SELECT
t.,
t.
FROM @ TEST_STAGE t)
FILES = ('test.csv')
FILE_FORMAT = (TYPE = CSV FIELD_DELIMITER = ',' SKIP_HEADER = 1);
这导致正确分配的列:
|-----|----------|---------|
| Row | EVENT_ID | USER_ID |
|-----|----------|---------|
| 1 | 1 | 123 |
|-----|----------|---------|
| 2 | 2 | 321 |
|-----|----------|---------|
为什么在外部 table 的情况下无法正确选择列?
非常感谢。
从 JSON 中拉出时需要使用列的名称。您所拥有的是创建 JSON 列,然后将其解析为 JSON 中名为“$1”和“$2”的属性。当它找不到这样的属性时,它对该列 returns NULL。
CREATE OR REPLACE EXTERNAL TABLE TEST_CSV_TABLE1(
event_id VARCHAR AS (value:c1::varchar),
user_id VARCHAR AS (value:c2::varchar)
)
WITH LOCATION = @TEST_STAGE
FILE_FORMAT = (TYPE = CSV FIELD_DELIMITER = ',' SKIP_HEADER = 1);
将 copy into
与 </code> 和 <code>
一起使用并不是像上面那样使用它们来解析 JSON,它是特定于 [=11= 的语法] 查询以引用文件中的列。
假设我有这样的 .csv 文件:
event,user
1,123
2,321
此 .csv 文件位于 s3 下。
运行 以下 sql 创建一个外部 table(使用 @TEST_STAGE 创建并具有正确的 s3 路径):
CREATE OR REPLACE EXTERNAL TABLE TEST_CSV_TABLE1(
event_id VARCHAR AS (value:::varchar),
user_id VARCHAR AS (value:::varchar)
)
WITH LOCATION = @TEST_STAGE
FILE_FORMAT = (TYPE = CSV FIELD_DELIMITER = ',' SKIP_HEADER = 1);
查询以下 table 结果如下:
|-----|----------------------------|----------|---------|
| Row | VALUE | EVENT_ID | USER_ID |
|-----|----------------------------|----------|---------|
| 1 | { "c1": "1", "c2": "123" } | NULL | NULL |
|-----|----------------------------|----------|---------|
| 2 | { "c1": "2", "c2": "321" } | NULL | NULL |
|-----|----------------------------|----------|---------|
但是,如果我只是创建一个 table 作为
CREATE OR REPLACE TABLE TEST_CSV_TABLE2(
event_id VARCHAR,
user_id VARCHAR
);
并像这样加载相同的文件:
COPY INTO TEST_CSV_TABLE2 FROM @TEST_STAGE
FILES = ('test.csv')
FILE_FORMAT = (TYPE = CSV FIELD_DELIMITER = ',' SKIP_HEADER = 1);
甚至喜欢:
COPY INTO TEST_CSV_TABLE2
FROM (
SELECT
t.,
t.
FROM @ TEST_STAGE t)
FILES = ('test.csv')
FILE_FORMAT = (TYPE = CSV FIELD_DELIMITER = ',' SKIP_HEADER = 1);
这导致正确分配的列:
|-----|----------|---------|
| Row | EVENT_ID | USER_ID |
|-----|----------|---------|
| 1 | 1 | 123 |
|-----|----------|---------|
| 2 | 2 | 321 |
|-----|----------|---------|
为什么在外部 table 的情况下无法正确选择列? 非常感谢。
从 JSON 中拉出时需要使用列的名称。您所拥有的是创建 JSON 列,然后将其解析为 JSON 中名为“$1”和“$2”的属性。当它找不到这样的属性时,它对该列 returns NULL。
CREATE OR REPLACE EXTERNAL TABLE TEST_CSV_TABLE1(
event_id VARCHAR AS (value:c1::varchar),
user_id VARCHAR AS (value:c2::varchar)
)
WITH LOCATION = @TEST_STAGE
FILE_FORMAT = (TYPE = CSV FIELD_DELIMITER = ',' SKIP_HEADER = 1);
将 copy into
与 </code> 和 <code>
一起使用并不是像上面那样使用它们来解析 JSON,它是特定于 [=11= 的语法] 查询以引用文件中的列。