雪花熊猫pd_writer用NULL写出表

时间:2020-08-12 06:04:55

标签: python pandas dataframe sqlalchemy snowflake-cloud-data-platform

我有一个使用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

3 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:1)

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

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

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

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

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

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

答案 2 :(得分:0)

我认为您已经看过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的较小数据帧上测试该过程,然后从那里开始进行扩展。