s3下.csv文件的雪花外部表

时间:2019-12-05 14:44:37

标签: snowflake-data-warehouse

假设我有.csv文件,例如:

yacc --defines=yaccWithSemanticAnd3AD.tab.h parser.y
flex lexer.l
gcc -O2 y.tab.c lex.yy.c -ll

此.csv文件位于s3下。

运行以下sql创建外部表(已创建@TEST_STAGE并具有正确的s3路径):

event,user
1,123
2,321

查询下表将得到以下输出:

CREATE OR REPLACE EXTERNAL TABLE TEST_CSV_TABLE1(
  event_id VARCHAR AS (value:$1::varchar),
  user_id VARCHAR AS (value:$2::varchar)
)
WITH LOCATION = @TEST_STAGE
FILE_FORMAT = (TYPE = CSV FIELD_DELIMITER = ',' SKIP_HEADER = 1);

但是,如果我只是将表创建为

|-----|----------------------------|----------|---------|
| Row |           VALUE            | EVENT_ID | USER_ID |
|-----|----------------------------|----------|---------|
|  1  | { "c1": "1", "c2": "123" } |   NULL   |   NULL  |
|-----|----------------------------|----------|---------|
|  2  | { "c1": "2", "c2": "321" } |   NULL   |   NULL  |
|-----|----------------------------|----------|---------|

并加载相同的文件,例如:

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.$1,
  t.$2
FROM @ TEST_STAGE t)
FILES = ('test.csv')
FILE_FORMAT = (TYPE = CSV FIELD_DELIMITER = ',' SKIP_HEADER = 1);

如果使用外部表,为什么不能正确选择列? 十分感谢。

1 个答案:

答案 0 :(得分:2)

从JSON中提取列时,需要使用该列的名称。您所拥有的是创建JSON列,然后将其解析为JSON中名为“ $ 1”和“ $ 2”的属性。当找不到这样的属性时,它将向该列返回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$1一起使用$2并没有像上面那样使用它们来解析JSON,它是copy into查询特定于引用列的语法在文件中。

相关问题