3

我正在尝试使用dask中的 read_sql_table,但我遇到了一些与index_col参数相关的问题。我的 sql 表没有任何数值,我不知道给index_col参数提供什么。

我在文档中读到,如果index_col是“object”类型,我必须提供“divisions”参数,但在阅读表格之前我不知道index_col中的值是什么。

我真的很困惑。不知道为什么我在使用 read_sql_table 时必须给出index_col而在使用read_csv时不必给出

4

2 回答 2

1

我发现在某些情况下,最容易DataFrame通过以下方式将对象分散到集群中来处理pd.read_sql它及其chunksize参数:

from dask import bag as db

sql_text = "SELECT ..."
sql_meta = {"column0": "object", "column1": "uint8"}
sql_conn = connect(...)
dfs_futs = map(client.scatter,               # Scatter each object to the cluster
               pd.read_sql(sql_text, 
                           sql_conn, 
                           chunksize=10_000, # Iterate in chunks of 10,000
                           columns=list(sql_meta.keys())))

# Now join our chunks (remotely) into a single frame.
df = db.from_sequence(list(dfs_futs)).to_dataframe(meta=sql_meta)              

这很好,因为您不需要处理在分布式节点和/或难以轻松分区数据的情况下难以管理的任何潜在驱动程序/包。

只是关于性能的说明,对于我的用例,我们利用数据库的外部表操作将数据输出到 CSV,然后使用pd.read_csv与上面的处理几乎相同)读取它,而SELECT ... FROM ... WHERE与 Dask 并行化和分块的方式相比查询,在性能方面是可以接受的,因为在数据库内执行分块是有成本的。

于 2020-07-09T18:58:11.203 回答
0

Dask 需要一种能够相互独立地读取数据分区的方法。这意味着能够使用“WHERE index_col >= val0 AND index_col < val1”之类的子句来表达每个部分的查询。如果您没有数字,dask cab 无法为您猜测合理的值,如果您可以确定一种提供合理分隔符的方法,您仍然可以这样做,例如list(string.ascii_letters). 如果必须,您还可以提供自己的完整 WHERE 子句。

请注意,OFFSET/LIMIT 不适用于此任务,因为

  • 对于任何给定的输入,通常不能保证结果(此行为是特定于数据库实现的)
  • 获取某个特定偏移量是通过对 while 查询的结果进行分页来完成的,因此服务器必须多次执行必要的工作量
于 2020-07-09T17:56:47.840 回答