查询暂存文件中的数据

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

有关在加载期间转换数据的语法,请参阅 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 |
+---------------------------------------+------+----------------------------------+-------------------------------+
Copy

这些 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_nameschema_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
    
    Copy
  • /tmp/data2.csv 包含两条记录:

    e|f
    g|h
    
    Copy

要暂存和查询文件,请执行以下操作:

-- 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 |
+-----+------+
Copy

备注

在此示例中,需要文件格式才能正确分析暂存文件中的字段。在第二个查询中,文件格式省略,导致 | 字段分隔符被忽略,并返回 $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 |
+-------------+-------------+
Copy

备注

如果文件格式包含在暂存定义中,则可以从 SELECT 语句中省略。请参阅 示例 3:查询 JSON 文件中的元素

示例 3:查询 JSON 文件中的元素

此示例演示如何暂存包含以下对象的 JSON 数据文件,然后在文件中查询对象中的单个元素:

{"a": {"b": "x1","c": "y1"}},
{"a": {"b": "x2","c": "y2"}}
Copy

此示例假定该文件已命名为 /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"               |
+--------------------+
Copy
语言: 中文