下载给定URI中的文件并以Bytes Array格式返回文件内容
FETCH_CONTENT 和 TRY_FETCH_CONTENT 用于异步下载指定 URI 中的文件,并以 VARBINARY 类型返回文件内容。两者的区别在于下载失败后的处理方式:
函数 | 下载成功 | 下载失败且重试耗尽 | 适用场景 |
| 返回文件内容 | 抛出异常,作业失败 | 文件内容是后续处理的必要输入,不允许跳过失败记录 |
| 返回文件内容 | 返回 | 允许跳过无效 URI、文件不存在、网络异常等失败记录 |
使用限制
仅实时计算引擎VVR 11.7.0及以上版本支持FETCH_CONTENT函数。
仅实时计算引擎VVR 11.9.0-preview.1及以上版本支持TRY_FETCH_CONTENT函数。
语法
VARBINARY FETCH_CONTENT(VARCHAR uri)
VARBINARY FETCH_CONTENT(VARCHAR uri, INTEGER concurrency)
VARBINARY TRY_FETCH_CONTENT(VARCHAR uri)
VARBINARY TRY_FETCH_CONTENT(VARCHAR uri, INTEGER concurrency)入参
参数 | 数据类型 | 说明 |
uri | VARCHAR | 该参数指定需要下载的文件路径。支持的URI schemes包括HTTP和Flink FileSystem所支持的Schema:
|
concurrency | INTEGER | 可选参数,用于设置每个 FETCH_CONTENT 函数实例的专用 I/O 线程池大小。该线程池负责文件系统读取、HTTP 客户端的异步任务和回调等。参数省略时,默认值为max(8, 当前 JVM 可用处理器数)。例如可用处理器数为 4 时默认值为 8,为 16 时默认值为 16。 |
如果uri为NULL,则返回NULL。如果非NULL的uri下载失败,则抛出相关异常。
如果uri为OSS路径,则需要配置OSS相关鉴权信息,参考配置Bucket鉴权信息
返回结果
数据类型 | 说明 |
VARBINARY | 文件内容 |
TRY_FETCH_CONTENT 只容忍运行时的内容获取失败。函数参数个数或类型错误、concurrency 超出取值范围等 SQL 校验错误仍会导致作业提交失败。
重试和超时配置
FETCH_CONTENT 和 TRY_FETCH_CONTENT 使用异步标量函数的统一重试和超时配置。请求并发、超时、重试由 Flink Async Scalar 算子统一管理。您可以在 SQL 作业中通过 SET 命令修改相关参数。
以下示例将重试策略设置为固定延迟重试,最多重试 2 次,两次请求之间等待 1 s,单条记录的异步调用超时时间为 30 s。
SET 'table.exec.async-scalar.retry-strategy' = 'FIXED_DELAY';
SET 'table.exec.async-scalar.max-attempts' = '2';
SET 'table.exec.async-scalar.retry-delay' = '1 s';
SET 'table.exec.async-scalar.timeout' = '30 s';配置 table.exec.async-scalar.max-attempts 为 2 时,函数最多发起 3 次请求,即首次请求加 2 次重试。如果在超时时间内没有足够时间完成全部重试,则以超时结果为准:FETCH_CONTENT 抛出异常,TRY_FETCH_CONTENT 返回 NULL。
完整的参数说明如下:
参数名 | 默认值 | 说明 |
table.exec.async-scalar.timeout | 3 min | 单条输入等待异步操作完成的超时时间。 |
table.exec.async-scalar.max-attempts | 3 | 最大重试次数,不包含首次调用;默认最多调用 4 次。 |
table.exec.async-scalar.max-concurrent-operations | 10 | 每个subtask 最多允许同时处于等待状态的异步操作数。该参数和concurrency 共同决定实际并发度。前者限制每个 subtask 的在途输入数量,后者限制函数实例可使用的 I/O 执行资源。实际并发通常受两者较小值限制。 |
table.exec.async-scalar.retry-strategy | FIXED_DELAY | 重试策略,可设置为
|
table.exec.async-scalar.retry-delay | 100 ms | 两次调用之间的固定重试间隔。 |
示例1:下载文件内容
测试数据
表 1. T1
input
uri(VARCHAR)
1
http://example.com/image_url
2
oss://example-bucket/example.pdf
3
NULL
测试语句
SELECT id, FETCH_CONTENT(uri) AS `value` FROM T1;返回结果如下
id (INT)
value (VARCHAR)
1
x'ffd8ffe00010......'
2
x'aaffd8ffe000......'
3
NULL
示例 2:下载失败时返回 NULL
测试数据
表 1. T1
input
uri(VARCHAR)
1
http://example.com/image_url
2
oss://example-bucket/example.pdf
3
invalid://path
使用
TRY_FETCH_CONTENT下载文件。某条记录下载失败时,该记录的content返回NULL,不会因为该次下载失败而中断作业。SELECT id, TRY_FETCH_CONTENT(uri) AS content FROM T2;返回结果如下
id (INT)
value (VARCHAR)
1
x'ffd8ffe00010......'
2
NULL
3
NULL
您可以过滤下载失败的记录,避免将
NULL传递给后续的多模态推理函数。SELECT id, content FROM ( SELECT id, TRY_FETCH_CONTENT(uri) AS content FROM T2 ) WHERE content IS NOT NULL;
示例 3:指定并发数
以下示例将每个算子实例的内容获取并发数设置为 8。8 必须是 SQL 中的整数字面量。
SELECT
id,
TRY_FETCH_CONTENT(uri, 8) AS content
FROM T2;
以下调用不合法,会在 SQL 校验阶段报错。
-- concurrency 不能引用字段。SELECT TRY_FETCH_CONTENT(uri, concurrency_column) FROM T3;
-- concurrency 的有效范围为 1~1024。SELECT TRY_FETCH_CONTENT(uri, 0) FROM T3;
SELECT TRY_FETCH_CONTENT(uri, 1025) FROM T3;相关文档
更多支持的内置函数,详情请参见支持的函数。
使用自定义函数(UDF),详情请参见自定义函数和管理自定义函数(UDF)。