将数据框从 jupyter notebook 写入雪花而不定义表列类型
Posted
技术标签:
【中文标题】将数据框从 jupyter notebook 写入雪花而不定义表列类型【英文标题】:write dataframe from jupyter notebook to snowflake without define table column type 【发布时间】:2021-05-13 05:49:07 【问题描述】:我在 jupyter notebook 中有一个数据框。我的目标是将此 df 作为新表导入到雪花中。
有没有什么方法可以直接将新表写入雪花而不定义任何表列的名称和类型?
我正在使用
import snowflake.connector as snow
from snowflake.connector.pandas_tools import write_pandas
from sqlalchemy import create_engine
import pandas as pd
connection = snowflake.connector.connect(
user='XXX',
password='XXX',
account='XXX',
warehouse='COMPUTE_WH',
database= 'SNOWPLOW',
schema = 'DBT_WN'
)
df.to_sql('aaa', connection, index = False)
它遇到了一个错误: DatabaseError: sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;'执行失败:字符串格式化期间并非所有参数都转换
谁能提供解决此问题的示例代码?
【问题讨论】:
df
的 schema 是否与 'DBT_WN' schema 相同?
@BlackRaven 是的,表应该保存为 'SNOWPLOW'.DBT_WN'.'aaa'
【参考方案1】:
这是一种方法 - 提前为我在 SO 中的代码格式以及 python 的空格与制表符“模型”相结合而道歉。如果您剪切粘贴,请检查制表符/空格...
由于 Snowsql 安全模型,请务必在您的连接参数中指定您正在使用的角色。 (通常默认角色是“PUBLIC”)
由于您已经混合使用了 sqlAlchemy ...这个想法不使用雪花 write_pandas,因此对于大型数据框来说这不是一个好的答案... sqlAlchemy 和 Snowflake 的一些奇怪行为;确保数据框列名是大写的;但是在 to_sql() 的参数中使用小写的表名 ...
def df2sf_alch(target_df, target_table):
# create a sqlAlchemy connection object
engine = create_engine(f"snowflake://your-sf-account-url",
creator=lambda:connection)
# re/create table in Snowflake
try:
# sqlAlchemy creates table based on a lower-case table name
# and it works to have uppercase df column names
target_df.to_sql(target_table.lower(), con=engine, if_exists='replace', index=False)
print(f"Table target_table.upper() re/created")
except Exception as e:
print(f"Could not replace table target_table.upper()", exc_info=1)
nrows = connection.cursor().execute(f"select count(*) from target_table").fetchone()[0]
print(f"Table target_table.upper() rows = nrows")
请注意,需要更改此函数以反映适当的“雪花帐户 url”,以便创建 sqlAlchemy 连接对象。此外,假设在 df 中处理了案例命名异常以及您已经定义的连接,您只需传递 df 和表的名称即可调用此函数,例如 df2sf_alch(my_df, 'MY_TABLE')
【讨论】:
以上是关于将数据框从 jupyter notebook 写入雪花而不定义表列类型的主要内容,如果未能解决你的问题,请参考以下文章
使用 jupyter-notebook + python + matplotlib 进行数据可视化
远程jupyter+pycharm配置之jupyter notebook切换虚拟环境
Jupyter Notebook这十大隐藏技巧,大大加速算法的迭代