Snowflake Python worksheet 从 URL 请求数据

0 投票
1 回答
41 浏览
提问于 2025-04-12 09:27

我正在使用Python工作表,想通过requests库从外部网址下载CSV数据。但是,我遇到了一个叫做NameResolutionError的错误,这似乎是个DNS解析的问题。以下是我收到的错误信息:

requests.exceptions.ConnectionError: HTTPSConnectionPool(host='www.data.gouv.fr', port=443): Max retries exceeded with url: /fr/datasets/r/5cb21a85-b0b0-4a65-a249-806a040ec372 (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7fb7f66e1450>: Failed to resolve 'www.data.gouv.fr' ([Errno -3] Temporary failure in name resolution)"))

这个错误发生在我尝试在Python工作表中执行以下代码时:

import snowflake.snowpark as snowpark
from snowflake.snowpark.functions import col
import pandas as pd
from io import StringIO
import requests

def load_csv_to_snowflake(session, url, table_name, delimiter, encoding):
    # Télécharger le contenu du fichier CSV depuis l'URL
    response = requests.get(url)
    if response.status_code != 200:
        raise Exception(f"Échec de la requête HTTP: {response.status_code}")
    
    # Lire le contenu dans un DataFrame pandas
    csv_string = response.content.decode(encoding)
    df = pd.read_csv(StringIO(csv_string), delimiter=delimiter)
    
    # Charger le DataFrame dans Snowflake en utilisant Snowpark
    session.write_pandas(df, table_name, auto_create_table=True)

def main(session: snowpark.Session): 
    # Liste des fichiers à charger
    files_to_load = [
        {
            "url": "https://static.data.gouv.fr/resources/lieux-de-vaccination-contre-la-covid-19/20240328-180518/centres-vaccination.json",
            "table_name": "table_file1",
            "delimiter": ";",
            "encoding": "utf-8"
        },
        # Ajouter les autres fichiers ici avec leurs paramètres respectifs
    ]

    # Charger chaque fichier
    for file_info in files_to_load:
        load_csv_to_snowflake(
            session,
            file_info["url"],
            file_info["table_name"],
            file_info["delimiter"],
            file_info["encoding"]
        )
    
    # Afficher un message de succès
    print("Chargement des fichiers terminé avec succès.")

我怀疑Snowflake中的Python UDF环境可能无法访问互联网,或者存在一些网络限制。以下是我的问题:

有没有人遇到过类似的问题,知道如何解决Snowflake的Python UDF?

有没有办法在Snowflake的Python UDF环境中配置网络设置或DNS,以允许外部互联网访问?

有没有什么最佳实践可以用来通过Python UDF将外部数据下载到Snowflake中?

任何帮助或指导都将非常感谢!

1 个回答

0

正如Lukasz在他的评论中提到的,你需要设置一下外部网络访问。默认情况下,Snowflake中的Python是被限制在内部环境里的。要想访问外部服务、API等,你需要通过创建网络规则、安全集成和外部访问集成来“打开防火墙”,这样才能指定允许的外部访问。

撰写回答