我仍在学习Dask以使用数据库:
我有一个Dask数据帧,可以成功从我的本地sql DB复制,就像这样:
ddf_authorized = dd.read_sql_table("cz_transaction_authorized", "mysql+pymysql://user_account:mysqlworld@127.0.0.1:3306/user","id")
ddf_mobileuser = dd.read_sql_table("cz_mobile_user", "mysql+pymysql://user_account:mysqlworld@127.0.0.1:3306/user","id")
ddf_users = dd.read_sql_table("users", "mysql+pymysql://user_account:mysqlworld@127.0.0.1:3306/user","id")
ddf_reader = dd.read_sql_table("reader", "mysql+pymysql://user_account:mysqlworld@127.0.0.1:3306/user","id")
ddf_mid = dd.read_sql_table("cz_mid","mysql+pymysql://user_account:mysqlworld@127.0.0.1:3306/user","id")
我知道我的本地数据库中有很多NA值,尤其是140万行的交易授权数据库,因此当我调用ddf_authorized.head()
只是想检查我的数据框时,它给了我错误
ValueError: Cannot convert non-finite values (NA or inf) to integer
我确实尝试使用fillna()
来填充NA值,但错误仍然存在,如下所示:
for x in list(ddf_authorized.columns.values):
if ddf_authorized[x].dtype != 'O':
ddf_authorized[x] = ddf_authorized[x].fillna(0)
else:
ddf_authorized[x] = ddf_authorized[x].fillna("-")
使用这些NA值检查Dask数据框是否有更安全的方法或想法?因为我很熟悉Pandas,并且对NA值没有任何问题,所以必须在Dask中查看此问题。
我尝试将数据库中的一张表导出到csv文件中,并且没有NA值,这是CSV文件http://www.sharecsv.com/s/147ba0bb507bb6dcc14a3a6c91af4eef/reader_table.csv
然后,我尝试使用dask.read_csv
进行阅读x = dd.read_csv("C:/Users/User/Desktop/Data Science Journey/My Cashlez Work Assets/Insight 16 Desember/reader_table.csv")
如果我运行x.head()
,则它可以成功运行而没有任何错误,但是如果我直接使用y.head()从数据库中读取它,则它将无法正常工作,如下所示:
y = dd.read_sql_table("reader", "mysql+pymysql://user_account:mysqlworld@127.0.0.1:3306/user","id")
y["id"] = ddf_reader["reader_id"].astype('int64')
y["devicetype_fk"] = ddf_reader["devicetype_fk"].astype('O')
y["serial_number"] = ddf_reader["serial_number"].astype('O')
所以也许这是read_sql_table()
的问题?
答案 0 :(得分:1)
Dask可能推断出错误的数据类型:它通过查看顶部的值来假定一个整数列。然后,您遇到了无法将意外的NA
转换为int的问题。您不会在Pandas上遇到这些问题,因为在那种情况下,整个列都将用于确定数据类型。
尝试使用meta
keyword of read_sql_table显式指定列的dtypes(例如float(对于带有nans和infs的数字类型)或object(对于任意混合的类型))。
例如,您可以将空的熊猫df作为元数据传递。
meta=pd.DataFrame(columns=['col1', 'col2']).astype({'col1': float})
在其中显式定义所需的dtypes {'col1': float}
。默认为对象。这似乎需要规范npartitions
(作为read_sql_table
的关键字参数),您可能仍然想这样做,以调整性能。