查询暂存文件中的数据¶
Snowflake 支持使用标准 SQL 查询位于内部(即 Snowflake)暂存区或 命名 外部(Amazon S3、Google Cloud Storage 或 Microsoft Azure)暂存区的数据文件。这对于检查/查看暂存文件的内容非常有用,尤其是在加载数据之前或卸载数据之后。
此外,通过引用暂存文件中的 元数据列,暂存数据查询可以返回有关文件的其他信息,例如文件名和行号。
Snowflake 利用对暂存数据查询的支持来实现 在加载期间转换数据。
备注
此功能主要用于执行简单查询,尤其是在加载和/或转换数据时,而 不是 用于取代将数据加载到表中和对表执行查询。
本主题内容:
查询语法和参数¶
使用具有以下语法的 SELECT 语句查询暂存数据文件:
SELECT [<alias>.]$<file_col_num>[:<element>] [ , [<alias>.]$<file_col_num>[:<element>] , ... ] FROM { <internal_location> | <external_location> } [ ( FILE_FORMAT => '<namespace>.<named_file_format>', PATTERN => '<regex_pattern>' ) ] [ <alias> ]
有关在加载期间转换数据的语法,请参阅 COPY INTO <table>。
重要
为外部暂存区返回的对象列表可包括一个或多个“目录 blob”;实际上,是以正斜杠字符 (/
) 结尾的路径,例如:
LIST @my_gcs_stage;
+---------------------------------------+------+----------------------------------+-------------------------------+
| name | size | md5 | last_modified |
|---------------------------------------+------+----------------------------------+-------------------------------|
| my_gcs_stage/load/ | 12 | 12348f18bcb35e7b6b628ca12345678c | Mon, 11 Sep 2019 16:57:43 GMT |
| my_gcs_stage/load/data_0_0_0.csv.gz | 147 | 9765daba007a643bdff4eae10d43218y | Mon, 11 Sep 2019 18:13:07 GMT |
+---------------------------------------+------+----------------------------------+-------------------------------+
这些 blob 是在 Google Cloud Platform 控制台中创建目录时列出的,不使用 Google 提供的任何其他工具。
当对象列表包含目录 blob 时,引用暂存区的 SELECT 语句可能会失败。为了避免错误,当暂存区的文件列表包含目录 blob 时,我们建议使用文件模式匹配来识别要包含的文件(即 PATTERN 子句)。
必填参数¶
[alias.]$file_col_num[:element] [ , [alias.]$file_col_num[:element] , ... ]
指定在内部或外部位置暂存的数据文件中的一组显式字段/列,其中:
alias
指定 FROM 子句中定义的可选“table”别名(如果有)。
file_col_num
指定包含要加载的数据的字段/列(在文件中)的位置编号(第一个字段为
1
,第二个字段为2
,等等)element
指定重复值的路径和元素名称(仅适用于 半结构化数据文件)。
internal_location
或external_location
指定暂存数据文件的位置:
internal_location
是 Snowflake 中暂存包含数据的文件的位置的 URI 说明符:@[namespace.]internal_stage_name[/path]
文件位于指定的已命名内部暂存区。
@[namespace.]%table_name[/path]
文件位于指定表的暂存区中。
@~[/path]
文件位于当前用户的暂存区。
external_location
是暂存包含数据的文件的命名外部暂存区或外部位置(Amazon S3、Google Cloud Storage 或 Microsoft Azure)的 URI 说明符:@[namespace.]external_stage_name[/path]
文件位于指定的命名外部暂存区。
其中:
namespace
是内部或外部暂存区所在的数据库和/或架构。如果数据库和架构当前正在用户会话中使用,则此参数为 选填;否则,为必填。选填的
path
参数将要查询的文件集限制为文件夹前缀下的文件。如果指定了path
,但路径中没有显式命名文件,则查询路径中的所有数据文件。
备注
外部存储位置(Amazon S3、Google Cloud storage 或 Microsoft Azure)的 URI 字符串 必须 用单引号括起来;但是,您可以将任何 URI 字符串用单引号括起来,这允许在位置和文件名中使用特殊字符,包括空格。例如:
- 内部:
'@~/path 1/file 1.csv'
'@%my table/path 1/file 1.csv'
'@my stage/path 1/file 1.csv'
相对路径修饰符(如
/./
和/../
)按字面解释,因为“路径”是名称的字面量前缀。例如:- S3:
COPY INTO mytable FROM @mystage/./../a.csv
在这些 COPY 语句中,系统在存储位置查找按字面名称
./../a.csv
命名的文件。
可选参数¶
( FILE_FORMAT => 'namespace.named_file_format' )
指定一种命名文件格式,该格式描述要查询的暂存数据文件的格式。
请注意,如果以下 任一 条件为真,则此参数选填:
文件的格式采用默认文件格式 (CSV),使用默认分隔符::code:`,`(作为字段分隔符),以及换行符(作为记录分隔符)。
文件位于内部或外部暂存区,暂存区定义描述了文件格式。
如果在用户会话的当前命名空间中引用文件格式,则可以省略格式标识符两边的单引号。
否则,此参数 必填。有关更多详细信息,请参阅 文件格式 (本主题内容)。
namespace`可以选择以 :samp:`database_name.schema_name
或schema_name
的形式指定表的数据库和/或架构。如果数据库和架构当前正在用户会话中使用,则此参数为 选填;否则,为必填。如果标识符包含空格、特殊字符或大小写混合字符,则整个字符串必须放在双引号内。放在双引号内的标识符也区分大小写。
PATTERN => 'regex_pattern'
正则表达式模式字符串用单引号括起来,可指定外部暂存区上要匹配的文件名和/或路径。
小技巧
为了获得最佳性能,请尽量避免应用对大量文件进行筛选的模式。
alias
指定暂存文件的内部/外部位置的“表”别名。
文件格式¶
要解析暂存数据文件,需要描述其文件格式。默认文件格式是字符分隔的 UTF-8 文本(即 CSV),使用逗号字符 (,
) 作为字段分隔符,换行符作为记录分隔符。如果源数据采用其他格式(JSON、Avro 等),则必须指定相应的文件格式类型(和选项)。
要显式指定文件格式选项,请通过以下方式之一进行设置:
- 查询暂存的数据文件:
作为为命名文件格式或暂存区对象指定的文件格式选项。然后可以在 SELECT 语句中引用命名的文件格式/暂存区对象。
- 从暂存的数据文件加载列:
作为在 COPY INTO <table> 中直接指定的文件格式选项。
作为为命名文件格式或暂存区对象指定的文件格式选项。然后可以在 COPY INTO <table> 语句中引用命名的文件格式/暂存区对象。
查询示例¶
示例 1:查询 CSV 文件中的列¶
下面的示例演示如何暂存多个 CSV 数据文件(具有相同的文件格式),然后查询文件中的数据列。
此示例假定文件具有以下名称,并且位于 macOS 或 Linux 环境的根目录中:
/tmp/data1.csv
包含两条记录:a|b c|d
/tmp/data2.csv
包含两条记录:e|f g|h
要暂存和查询文件,请执行以下操作:
-- Create a file format. CREATE OR REPLACE FILE FORMAT myformat TYPE = 'csv' FIELD_DELIMITER = '|'; -- Create an internal stage. CREATE OR REPLACE STAGE mystage1; -- Stage the data files. PUT file:///tmp/data*.csv @mystage1; -- Query the filename and row number metadata columns and the regular data columns in the staged file. -- Optionally apply pattern matching to the set of files in the stage and optional path. -- Note that the table alias is provided to make the statement easier to read and is not required. SELECT t.$1, t.$2 FROM @mystage1 (file_format => 'myformat', pattern=>'.*data.*[.]csv.gz') t; +----+----+ | $1 | $2 | |----+----| | a | b | | c | d | | e | f | | g | h | +----+----+ SELECT t.$1, t.$2 FROM @mystage1 t; +-----+------+ | $1 | $2 | |-----+------| | a|b | NULL | | c|d | NULL | | e|f | NULL | | g|h | NULL | +-----+------+
备注
在此示例中,需要文件格式才能正确分析暂存文件中的字段。在第二个查询中,文件格式省略,导致 |
字段分隔符被忽略,并返回 $1
和 $2
的值。
但是,如果文件格式包含在暂存定义中,则可以从 SELECT 语句中省略。请参阅`示例 3:查询 JSON 文件中的元素`_。
示例 2:查询暂存的数据文件时调用函数¶
获取 示例 1:查询 CSV 文件中的列 中暂存的数据文件中每列的第一个字符的 ASCII 代码:
SELECT ascii(t.$1), ascii(t.$2) FROM @mystage1 (file_format => myformat) t; +-------------+-------------+ | ASCII(T.$1) | ASCII(T.$2) | |-------------+-------------| | 97 | 98 | | 99 | 100 | | 101 | 102 | | 103 | 104 | +-------------+-------------+
备注
如果文件格式包含在暂存定义中,则可以从 SELECT 语句中省略。请参阅 示例 3:查询 JSON 文件中的元素。
示例 3:查询 JSON 文件中的元素¶
此示例演示如何暂存包含以下对象的 JSON 数据文件,然后在文件中查询对象中的单个元素:
{"a": {"b": "x1","c": "y1"}}, {"a": {"b": "x2","c": "y2"}}
此示例假定该文件已命名为 /tmp/data1.json
,并且位于 macOS 或 Linux 环境的根目录中:
要暂存和查询文件,请执行以下操作:
-- Create a file format CREATE OR REPLACE FILE FORMAT my_json_format TYPE = 'json'; -- Create an internal stage CREATE OR REPLACE STAGE mystage2 FILE_FORMAT = my_json_format; -- Stage the data file PUT file:///tmp/data1.json @mystage2; -- Query the repeating a.b element in the staged file SELECT parse_json($1):a.b FROM @mystage2/data1.json.gz; +--------------------+ | PARSE_JSON($1):A.B | |--------------------| | "x1" | | "x2" | +--------------------+