雪花熊猫pd_writer用NULL写出表

问题描述

我有一个使用SQLAlchemy引擎和df1['mean'] = np.log10(df1['mean']) df1['usage'] = np.log10(df1['usage']) df1['count'] = np.log10(df1['count']) df1['Max_utilization'] = np.log10(df1['Max_utilization']) X_TC01_v1 = df1.drop(['Max_utilization'],axis=1) y_TC01_v1 = df1['Max_utilization'] """split data into train and test""" X_train_tc01_v1,X_test_tc01_v1,y_train_tc01_v1,y_test_tc01_v1 = train_test_split(X_TC01_v1,y_TC01_v1,test_size=0.1,random_state=111) rf_model = RandomForestRegressor(n_estimators=20,criterion='mse',verbose=0) rf_model.fit(X_train_tc01_v1,y_train_tc01_v1) 函数写给Snowflake的Pandas数据框。它工作正常,但是由于雪花限制,我必须使用to_sql选项。这对于较小的数据帧也很好。但是,某些数据帧有500k +行,每块15k记录时,要完全写入Snowflake会花费很多时间。

我做了一些研究,发现了Snowflake提供的chunksize方法,该方法显然可以更快地加载数据帧。我的Python脚本的完成速度更快,我看到它创建了一个具有所有正确的列和正确的行数的表,但是每一行中每一列的值都是NULL。

我认为这是一个pd_writerNaN的问题,并尝试了一切可能的方法将NULL替换为NaN,并且在数据框中进行替换,到表时,所有内容都变为NULL。

如何使用None将这些巨大的数据帧正确地写入Snowflake?有可行的选择吗?

编辑:按照克里斯的回答,我决定尝试使用官方示例。这是我的代码和结果集:

pd_writer

代码工作正常,没有任何障碍,但是当我查看创建的表时,它全都是NULL。再次。

This is what dummy_demo_table shows me

解决方法

结果证明,文档(可以说是Snowflake的最薄弱点)与现实不同步。这是真正的问题:https://github.com/snowflakedb/snowflake-connector-python/issues/329。它只需要在列名中使用一个大写字母,即可正常工作。

我的解决方法是简单地执行:df.columns = map(str.upper,df.columns),然后再调用to_sql

,

我也遇到过同样的问题,请不要失望,有一个解决方案在眼前。在雪花中从雪花工作表或雪花环境中创建表时,该表以大写形式命名对象以及所有列和约束。但是,当您使用数据框从Python创建表时,将按照您在数据框中指定的确切情况创建对象。在您的情况下,它是column = ['name','balance'])。因此,当发生插入操作时,它将在雪花中查找所有大写的列名,但找不到它,它将执行插入操作,但是将您的2列设置为null,因为这些列被创建为可为空。

解决此问题的最佳方法是在数据框中以大写形式创建列,columns = ['NAME','BALANCE'])。

我确实认为雪花应该解决并解决此问题,因为这不是预期的行为。

即使您尝试从具有空值的表中进行选择,您也会收到错误消息,例如: 选择名称,从dummy_demo_table中获取余额

您可能会收到类似以下的错误, SQL编译错误:位置7的错误第1行无效标识符'name'

但是以下内容将起作用 SELECT * from dummy_demo_table

,

我认为您已经看过documentation并看到了以下示例代码:

import pandas
from snowflake.connector.pandas_tools import pd_writer

# Create a DataFrame containing data about customers
df = pandas.DataFrame([('Mark',10),('Luke',20)],columns=['name','balance'])

# Specify that the to_sql method should use the pd_writer function
# to write the data from the DataFrame to the table named "customers"
# in the Snowflake database.
df.to_sql('customers',engine,index=False,method=pd_writer)

如果没有带有匹配虚拟数据的Python代码示例,我们认为我们无法为您提供更多帮助,以便我们进行进一步调查。我的建议是首先使上面的示例工作,然后在不包含任何NaN的较小数据帧上测试该过程,然后从那里开始进行扩展。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...