我正在尝试以编程方式从公共网站下载数据,该网站提供用于下载 csv 的静态 URL,每周更新一次。
我的思考过程涉及使用存储过程(具有外部网络访问权限)将文件下载到内部阶段,然后在这些文件之上构造一个表/视图。然后,我将有一个任务自动化该过程,每周运行一次以自动下载新文件。
我整理了以下过程,它能够访问文件流(因此外部访问似乎可以工作),但当我尝试写入内部阶段时失败。
create or replace procedure download_data(file_url string, dest_stage string, dest_filename string)
returns variant
language python
runtime_version = 3.11
packages = ('snowflake-snowpark-python', 'urllib3')
external_access_integrations = (my_access_integration)
handler = 'main'
execute as caller
as
$$
from snowflake.snowpark import FileOperation
import urllib3
import os
def main(session, file_url, dest_stage, dest_filename):
http = urllib3.PoolManager()
resp = http.request('GET', file_url, preload_content = False,)
print(resp.read(10)) # this works!
sf = FileOperation(session)
sf.put_stream(
input_stream = resp,
stage_location = os.path.join(dest_stage, dest_filename),
auto_compress = False,
)
return f'File from ({file_url}) landed in stage {dest_stage} with name {dest_filename}'
$$
;
我收到的错误指出:
io.UnsupportedOperation: File or stream is not seekable.
我是否错误地使用了文件流,或者
put_stream
方法尚不支持此行为?
您可以使用以下方法将响应转换为可搜索流:
content_bytes = response.data
seekable_stream = io.BytesIO(content_bytes)
事先确认
response.status == 200
。