假设我有.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);
如果使用外部表,为什么不能正确选择列? 十分感谢。
答案 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
查询特定于引用列的语法在文件中。