来自 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= 的语法] 查询以引用文件中的列。