我正在尝试使用dask中的 read_sql_table,但我遇到了一些与index_col参数相关的问题。我的 sql 表没有任何数值,我不知道给index_col参数提供什么。
我在文档中读到,如果index_col是“object”类型,我必须提供“divisions”参数,但在阅读表格之前我不知道index_col中的值是什么。
我真的很困惑。不知道为什么我在使用 read_sql_table 时必须给出index_col而在使用read_csv时不必给出。
我正在尝试使用dask中的 read_sql_table,但我遇到了一些与index_col参数相关的问题。我的 sql 表没有任何数值,我不知道给index_col参数提供什么。
我在文档中读到,如果index_col是“object”类型,我必须提供“divisions”参数,但在阅读表格之前我不知道index_col中的值是什么。
我真的很困惑。不知道为什么我在使用 read_sql_table 时必须给出index_col而在使用read_csv时不必给出。
我发现在某些情况下,最容易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 并行化和分块的方式相比查询,在性能方面是可以接受的,因为在数据库内执行分块是有成本的。
Dask 需要一种能够相互独立地读取数据分区的方法。这意味着能够使用“WHERE index_col >= val0 AND index_col < val1”之类的子句来表达每个部分的查询。如果您没有数字,dask cab 无法为您猜测合理的值,如果您可以确定一种提供合理分隔符的方法,您仍然可以这样做,例如list(string.ascii_letters)
. 如果必须,您还可以提供自己的完整 WHERE 子句。
请注意,OFFSET/LIMIT 不适用于此任务,因为