用于从网站下载数据的雪花存储过程

问题描述 投票:0回答:1

我正在尝试以编程方式从公共网站下载数据,该网站提供用于下载 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
方法尚不支持此行为?

stored-procedures snowflake-cloud-data-platform
1个回答
0
投票

您可以使用以下方法将响应转换为可搜索流:

content_bytes = response.data 
seekable_stream = io.BytesIO(content_bytes)

事先确认

response.status == 200

© www.soinside.com 2019 - 2024. All rights reserved.