FILES
定义远端存储中的数据文件,用于数据导入和导出:
FILES() 支持以下数据源和文件格式:
- 数据源:
- HDFS
- AWS S3
- Google Cloud Storage
- 其他 S3 兼容存储系统
- Microsoft Azure Blob Storage
- NFS(NAS)
- 文件格式:
- Parquet
- ORC (从 v3.3 开始支持)
- CSV (从 v3.3 开始支持)
- Avro (从 v3.4.4 开始支持,仅用于导入)
从 v3.2 开始,FILES() 进一步支持复杂数据类型,包括 ARRAY、JSON、MAP 和 STRUCT,以及基本数据类型。
FILES() 用于导入
从 v3.1.0 开始,StarRocks 支持使用表函数 FILES() 定义远端存储中的只读文件。它可以通过文件的路径相关属性访问远端存储,推断文件中的表结构,并返回数据行。您可以直接使用 SELECT 查询数据行,使用 INSERT 将数据行导入到现有表中,或使用 CREATE TABLE AS SELECT 创建新表并将数据行导入其中。从 v3.3.4 开始,您还可以使用 FILES() 和 DESC 查看数据文件的结构。
语法
FILES( data_location , [data_format] [, schema_detect ] [, StorageCredentialParams ] [, columns_from_path ] [, list_files_only ] [, list_recursively])
参数
所有参数均为 "key" = "value" 对。
data_location
用于访问文件的 URI。
您可以指定路径或文件。例如,您可以将此参数指定为 "hdfs://<hdfs_host>:<hdfs_port>/user/data/tablename/20210411",以从 HDFS 服务器上的路径 /user/data/tablename 加载名为 20210411 的数据文件。
您还可以使用通配符 ?、*、[] 或 ^ 指定多个数据文件的保存路径。例如,您可以将此参数指定为 "hdfs://<hdfs_host>:<hdfs_port>/user/data/tablename/*/*" 或 "hdfs://<hdfs_host>:<hdfs_port>/user/data/tablename/dt=202104*/*",以从 HDFS 服务器上的路径 /user/data/tablename 加载所有分区或仅 202104 分区的数据文件。
通配符也可以用于指定中间路径。
-
要访问 HDFS,您需要将此参数指定为:
"path" = "hdfs://<hdfs_host>:<hdfs_port>/<hdfs_path>"
-- 示例: "path" = "hdfs://127.0.0.1:9000/path/file.parquet" -
要访问 AWS S3:
-
如果您使用 S3 协议,您需要将此参数指定为:
"path" = "s3://<s3_path>"
-- 示例: "path" = "s3://path/file.parquet" -
如果您使用 S3A 协议,您需要将此参数指定为:
"path" = "s3a://<s3_path>"
-- 示例: "path" = "s3a://path/file.parquet"
-
-
要访问 Google Cloud Storage,您需要将此参数指定为:
"path" = "s3a://<gcs_path>"
-- 示例: "path" = "s3a://path/file.parquet" -
要访问 Azure Blob Storage:
-
如果您的存储账户允许通过 HTTP 访问,您需要将此参数指定为:
"path" = "wasb://<container>@<storage_account>.blob.core.windows.net/<blob_path>"
-- 示例: "path" = "wasb://testcontainer@testaccount.blob.core.windows.net/path/file.parquet" -
如果您的存储账户允许通过 HTTPS 访问,您需要将此参数指定为:
"path" = "wasbs://<container>@<storage_account>.blob.core.windows.net/<blob_path>"
-- 示例: "path" = "wasbs://testcontainer@testaccount.blob.core.windows.net/path/file.parquet"
-
-
要访问 NFS(NAS):
"path" = "file:///<absolute_path>"
-- 示例: "path" = "file:///home/ubuntu/parquetfile/file.parquet"备注要通过
file://协议访问 NFS(NAS),请将同一 NAS 设备作为 NFS 挂载到需要访问该路径的节点上的相同目录下:- 对于读写操作,需要挂载到每个 FE 节点以及每个 BE 或 CN 节点。FE 节点会列举文件并推断文件 Schema,BE/CN 节点会读取数据。
- 对于仅写操作,需要挂载到每个 BE 或 CN 节点。
data_format
数据文件的格式。有效值:
parquetorc(从 v3.3 开始支持)csv(从 v3.3 开始支持)avro(从 v3.4.4 开始支持,仅用于导入)
您必须为特定数据文件格式设置详细选项。
当 list_files_only 设置为 true 时,您无需指定 data_format。
Parquet
Parquet 格式示例:
"format"="parquet",
"parquet.use_legacy_encoding" = "true", -- 仅用于导出
"parquet.version" = "2.6" -- 仅用于导出
在读取 Parquet 文件时(例如使用 FILES() 或 Broker Load),StarRocks 会根据 Parquet TIMESTAMP 逻辑类型的 isAdjustedToUTC 属性将其映射为 DATETIME:
- 即时语义:如果
isAdjustedToUTC为true,该值标识时间轴上一个已归一化为 UTC 的时刻。StarRocks 会将其转换为当前会话时区下的本地时间。 - 本地语义:如果
isAdjustedToUTC为false,该值是一个不带时区的本地时间。StarRocks 按原样返回该值,不受会话时区影响。 - 旧版 INT96 物理类型不携带
isAdjustedToUTC属性。无论该 INT96 时间戳是顶层列还是嵌套在 STRUCT、ARRAY 或 MAP 中,StarRocks 都将其视为已归一化为 UTC 的时刻,并转换为会话时区下的本地时间。
行为变更:在早期版本中,StarRocks 在读取本地语义(isAdjustedToUTC 为 false)的时间戳时会按会话时区偏移量进行平移。当前版本会按写入的原值返回。如果会话时区不是 UTC,同一文件返回的值将与早期版本不同(当前行为符合 Parquet 规范)。
parquet.use_legacy_encoding
控制用于 DATETIME 和 DECIMAL 数据类型的编码技术。有效值:true 和 false(默认)。此属性仅支持数据导出。
如果此项设置为 true:
- 对于 DECIMAL 类型,系统使用
fixed_len_byte_array编码。 - 对于 DATETIME 类型,系统使用
INT96编码。
如果此项设置为 false:
- 对于 DECIMAL 类型,系统使用
INT32或INT64编码。 - 对于 DATETIME 类型,系统使用
INT64编码。- 即时语义:如果 Parquet TIMESTAMP 类型的
isAdjustedToUTC设 置为true,系统将输出一个已转换为 UTC 的时间戳。每个值都能在时间轴上唯一标识一个特定时刻,并可转换为特定时区。 - 本地语义:如果 Parquet TIMESTAMP 类型的
isAdjustedToUTC设置为false,系统将输出一个表示本地时区中的年、月、日、时、分、秒及亚秒的时间戳,无论具体哪个时区被视为本地时区。此类值始终以相同方式显示,无论当前生效的本地时区为何,且无法标识时间轴上的特定时刻。
- 即时语义:如果 Parquet TIMESTAMP 类型的
对于 DECIMAL 128 数据类型,仅支持 fixed_len_byte_array 编码。parquet.use_legacy_encoding 不生效。
parquet.version
控制系统导出数据的 Parquet 版本。从 v3.4.6 开始支持。有效值:1.0、2.4 和 2.6(默认)。此属性仅支持数据导出。
CSV
CSV 格式示例:
"format"="csv",
"csv.column_separator"="\\t",
"csv.enclose"='"',
"csv.skip_header"="1", -- 仅用于导入
"csv.escape"="\\"
csv.column_separator
指定数据文件为 CSV 格式时使用的列分隔符。如果您未指定此参数,则默认为 \\t,表示制表符。您通过此参数指定的列分隔符必须与数据文件中实际使用的列分隔符相同。否则,由于数据质量不足,导入作业将失败。
使用 Files() 的任务是根据 MySQL 协议提交的。StarRocks 和 MySQL 都会在导入请求中转义字符。因此,如果列分隔符是不可见字符,如制表符,您必须在列分隔符前加上反斜杠 (\)。例如,如果列分隔符是 \t,您必须输入 \\t;如果列分隔符是 \n,您必须输入 \\n。Apache Hive™ 文件使用 \x01 作为列分隔符,因此如果数据文件来自 Hive,您必须输入 \\x01。
- 对于 CSV 数据,您可以使用 UTF-8 字符串,如逗号 (,) 、制表符或管道符 (|),其长度不超过 50 字节,作为文本分隔符。
- 空值使用
\N表示。例如,一个数据文件由三列组成,其中一条记录在第一列和第三列中有数据,但在第二列中没有数据。在这种情况下,您需要在第二列中使用\N表示空值。这意味着记录必须编写为a,\N,b而不是a,,b。a,,b表示记录的第二列包含一个空字符串。
csv.enclose
指定当数据文件为 CSV 格式时,根据 RFC4180 用于包裹字段值的字符。类型:单字节字符。默认值:NONE。最常见的字符是单引号 (') 和双引号 (")。
所有由 enclose 指定字符包裹的特殊字符(包括行分隔符和列分隔符)都被视为普通符号。StarRocks 可以超越 RFC4180,因为它允许您指定任何单字节字符作为 enclose 指定字符。
如果字段值包含 enclose 指定字符,您可以使用相同的字符来转义该 enclose 指定字符。例如,您将 enclose 设置为 ", 而字段值是 a "quoted" c。在这种情况下,您 可以将字段值输入为 "a ""quoted"" c" 到数据文件中。
csv.skip_header
指定要跳过的 CSV 格式数据中的标题行数。类型:INTEGER。默认值:0。此属性仅支持数据导入。
在某些 CSV 格式的数据文件中,若干标题行用于定义元数据,如列名和列数据类型。通过设置 skip_header 参数,您可以使 StarRocks 跳过这些标题行。例如,如果您将此参数设置为 1,StarRocks 在数据导入期间会跳过数据文件的第一行。
数据文件中的标题行必须使用您在导入语句中指定的行分隔符分隔。
csv.escape
指定用于转义各种特殊字符的字符,例如行分隔符、列分隔符、转义字符和 enclose 指定字符,这些字符随后被 StarRocks 视为普通字符,并作为它们所在字段值的一部分进行解析。类型:单字节字符。默认值:NONE。最常见的字符是斜杠 (\),在 SQL 语句中必须写为双斜杠 (\\)。
escape 指定的字符适用于每对 enclose 指定字符的内部和外部。
以下是两个示例:
- 当您将
enclose设置为"并将escape设置为\时,StarRocks 将"say \"Hello world\""解析为say "Hello world"。- 假设列分隔符是逗号 (
,)。当您将escape设置为\时,StarRocks 将a, b\, c解析为两个独立的字段值:a和b, c。
schema_detect
从 v3.2 开始,FILES() 支持自动结构检测和同一批数据文件的联合化。StarRocks 首先通过对批中随机数据文件的某些数据行进行采样来检测数据的结构。然后,StarRocks 将批中所有数据文件的列联合化。
您可以使用以下参数配置采样规则:
auto_detect_sample_files:每批中要采样的随机数据文件数量。默认情况下,选择第一个和最后一个文件。范围:[0, + ∞]。默认值:2。auto_detect_sample_rows:每个采样数据文件中要扫描的数据行数。范围:[0, + ∞]。默认值:500。auto_detect_types:(仅适用于 CSV 文件)- 是否猜测采样列的数据类型,或者直接假定为字符串。{true | false}。默认值:true。
采样后,StarRocks 根据以下规则联合化所有数据文件的列:
- 对于具有不同列名或索引的列,每个列被识别为一个独立的列,最终返回所有独立列的联合。
- 对于具有相同列名但不同数据类型的列,它们被识别为同一列,但具有相对较细粒度的通用数据类型。例如,如果文件 A 中的列
col1是INT,但在文件 B 中是DECIMAL,则返回的列中使用DOUBLE。- 所有整数列将被联合化为一个整体较粗粒度的整数类型。
- 整数列与
FLOAT类型列一起将被联合化为 DECIMAL 类型。 - 字符串类型用于联合化其他类型。
- 通常,
STRING类型可以用于联合化所有数据类型。 - 如果类型自动检测已关闭,则所有列都将返回
STRING类型。
您可以参考示例 5。
如果 StarRocks 无法联合化所有列,它会生成一个包含错误信息和所有文件结构的结构错误报告。
单批中的所有数据文件必须具有相同的文件格式。