簡體   English   中英

雪花復制到 Python 雪花連接器中沒有錯誤的拒絕文件

[英]Snowflake Copy Into rejecting file without error in Python Snowflake Connector

我正在使用 Python Snowflake Connector 將 JSON 文件放入 Snowflake Stage,然后 COPY INTO 將 JSON 插入表中。

這是我的代碼:

import snowflake.connector

snowflake_conn = snowflake.connector.connect(
            user=sf_user,
            password=sf_password,
            account=sf_account
            )

role_init = "USE ROLE ELT_ROLE"
wh_init = "USE WAREHOUSE TEST_WH"
db_init = "USE DATABASE TEST_DB"
schema_init = "USE SCHEMA TEST_SCHEMA"

snowflake_conn_cur.execute(role_init)
snowflake_conn_cur.execute(wh_init)
snowflake_conn_cur.execute(db_init)
snowflake_conn_cur.execute(schema_init)

remove_file_command = 'REMOVE @TEST_STAGE/test_file.json;'
put_file_command = 'PUT file://test_file.json @TEST_STAGE;'
truncate_existing_table_data_command = 'TRUNCATE TABLE OUTPUT_TABLE;'
copy_file_command = 'COPY INTO OUTPUT_TABLE FROM @TEST_STAGE/test_file.json file_format=(TYPE=JSON) on_error=CONTINUE;'

snowflake_conn_cur.execute(remove_file_command)
snowflake_conn_cur.execute(put_file_command)
snowflake_conn_cur.execute(truncate_existing_table_data_command)
snowflake_conn_cur.execute(copy_file_command)

我的代碼成功執行,但我在 Snowflake 中注意到該文件被拒絕(單獨的問題)。

在 Snowflake Python 連接器中,在 cursor 執行語句上,有沒有辦法讓它返回錯誤並使用它來驗證它是否成功完成?

沒有它,它基本上是默默地失敗。 我能想到的唯一另一種方法是在事后查詢表以查看它是否有數據,但如果表沒有事先被截斷,這可能並不總是有幫助。

僅對於 PUT/GET,它應該默認返回錯誤。 對於您的示例,使用:

PUT file://test_file.json

在 Mac/Linux 機器上是不正確的(應該是PUT file:///test_file.json ),默認情況下會生成一個堆棧跟蹤,如下例所示:

cs = ctx.cursor()
cs.execute("PUT file://Users/<user>/Downloads/result_00XXX.csv @~")
cs.close()
ctx.close()

得到我:

$python basic_test.py
Traceback (most recent call last):
  File "basic_test.py", line 37, in <module>
    cs.execute("PUT file://Users/<user>/Downloads/result_00XXX.csv @~")
  File "/Users/<user>/Documents/Connectors/python/snow/lib/python3.8/site-packages/snowflake/connector/cursor.py", line 763, in execute
    sf_file_transfer_agent.execute()
  File "/Users/<user>/Documents/Connectors/python/snow/lib/python3.8/site-packages/snowflake/connector/file_transfer_agent.py", line 366, in execute
    self._init_file_metadata()
  File "/Users/<user>/Documents/Connectors/python/snow/lib/python3.8/site-packages/snowflake/connector/file_transfer_agent.py", line 966, in _init_file_metadata
    Error.errorhandler_wrapper(
  File "/Users/<user>/Documents/Connectors/python/snow/lib/python3.8/site-packages/snowflake/connector/errors.py", line 272, in errorhandler_wrapper
    handed_over = Error.hand_to_other_handler(
  File "/Users/<user>/Documents/Connectors/python/snow/lib/python3.8/site-packages/snowflake/connector/errors.py", line 327, in hand_to_other_handler
    cursor.errorhandler(connection, cursor, error_class, error_value)
  File "/Users/<user>/Documents/Connectors/python/snow/lib/python3.8/site-packages/snowflake/connector/errors.py", line 206, in default_errorhandler
    raise error_class(
snowflake.connector.errors.ProgrammingError: 253006: 253006: File doesn't exist: ['Users/<user>/Downloads/result_00XXXX.csv']

您還可以使用 try/catch 塊來獲取錯誤:

cs = ctx.cursor()

try:
    cs.execute("PUT file://Users/<user>/Downloads/result_00XXX.csv @~")
except Exception as err:
    print(err)
finally:
    cs.close()
ctx.close()

得到我:

$ python basic_test.py
253006: 253006: File doesn't exist: ['Users/<user>/Downloads/result_00XXX.csv']

刪除 COPY INTO function 中的“on_error=CONTINUE”命令以引發錯誤。 嘗試將文件加載到表中時導致錯誤的問題是文件太大。

為了解決文件大小問題,由於我的 JSON 被封裝到一個數組中,因此在 COPY INTO 命令的 file_format 上設置 STRIP_OUTER_ARRAY=TRUE 會刪除該數組並將每個 JSON 節點加載到目標表中自己的行中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM