Dask DataFrame.map_partition()写入db表

时间:2017-11-30 15:39:12

标签: python mysql dask dask-distributed

我有一个dask数据框,在一些转换后包含一些数据。我想将这些数据写回mysql表。我已经实现了一个函数,它将数据帧作为db url并将数据帧写回数据库。因为我需要一些人对数据帧的数据进行一些最终编辑,所以我使用pandas df.to_dict('record')来处理写操作。

该功能看起来像

def store_partition_to_db(df, db_url):
    from sqlalchemy import create_engine
    from mymodels import DBTableBaseModel

    records_dict = df.to_dict(records)
    records_to_db = []
    for record in records_dict:
        transformed_record = transform_record_some_how # transformed_record is a dictionary
        records_to_db.append(transformed_record)

    engine = create_engine(db_uri)
    engine.execute(DBTableBaseModel.__table__.insert(), records_to_db)

    return records_to_db

在我的dask代码中:

from functools import partial
partial_store_partition_to_db(store_partition_to_db db_url=url)
dask_dataframe = dask_dataframe_data.map_partitions(partial_store_partition_to_db)
all_records = dask_dataframe.compute()

print len([record_dict for record_list in all_records for record_dict in record_list]] # Gives me 7700

但是当我去MySQL中受尊重的表时,我得到7702在所有列上都是相同的值。当我尝试使用该值过滤all_records时,不返回任何字典。有没有人遇到过这种情况?如何使用dask处理来自paritions的数据库写入?

PS:我使用LocalCluster和dask distributed

1 个答案:

答案 0 :(得分:1)

问题是我没有在models方法中提供元信息,因此它创建了一个带有foo值的ataframe,我将其转换为db