Snowflake使用通配符读取S3存储桶同前缀文件失败如何解决
问题说明
需求为读取S3存储桶中所有文件名前缀相同的文件。
执行以下SQL未实现预期效果:
with s3 as ( select $1 as json_array from '@stage/airflow/reponse__2022-06-06_05*' (file_format => 'public.S3_JSON') ) select f.value,f.value:CompanyId from s3, Table(Flatten(s3.json_array)) f
排查&修复方案
按优先级依次调整:
- 修正路径拼写错误:代码中
reponse为拼写错误,正确拼写为response,先将路径修改为@stage/airflow/response__2022-06-06_05*再测试。 - 验证单文件JSON解析逻辑:先取一个符合前缀规则的实际存在的文件,执行查询确认JSON能正常读取,示例语句:
select $1 from '@stage/airflow/response__2022-06-06_05_00.json' (file_format => 'public.S3_JSON') limit 1;
如果单文件查询返回结果异常,检查public.S3_JSON文件格式配置:如果单文件内的JSON根节点是数组,要么在文件格式参数中开启STRIP_OUTER_ARRAY = TRUE直接自动展开外层数组,要么确认$1返回值是合法ARRAY类型,否则FLATTEN函数会因输入类型不合法返回空值或直接报错。
- 调整通配符匹配规则:Snowflake中单
*通配符仅匹配当前目录层级的任意字符,如果同前缀文件存放在airflow路径的子目录下,需要将通配符写法调整为@stage/airflow/**/response__2022-06-06_05*,才能递归匹配所有子目录下的符合前缀规则的文件。 - 校验权限配置:如果以上调整后仍无法读取文件,执行
DESC STAGE <你的实际stage名>;确认当前使用的角色拥有对应stage的读取权限,同时检查S3侧配置的访问凭证对应的IAM策略,已授予对应前缀路径下的s3:ListBucket和s3:GetObject权限。
内容的提问来源于stack exchange,提问作者Karthik
相关产品推荐
相关产品推荐

