为什么dask的read_sql_表需要index_col参数?

为什么dask的read_sql_表需要index_col参数?,dask,dask-dataframe,Dask,Dask Dataframe,我试图使用dask中的read_sql_表,但我遇到了一些与index_col参数相关的问题。我的sql表没有任何数值,我不知道给index\u col参数赋予什么 我在文档中读到,如果index_col是object类型,我必须提供divisions参数,但在读取表之前,我不知道index_col中的值是什么 我真的很困惑。不知道为什么在使用read\u sql\u table时必须给出索引列,但在使用read\u csv时却不必给出索引列。Dask需要一种能够独立读取数据分区的方法。这意味着

我试图使用dask中的read_sql_表,但我遇到了一些与index_col参数相关的问题。我的sql表没有任何数值,我不知道给index\u col参数赋予什么

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


我真的很困惑。不知道为什么在使用read\u sql\u table时必须给出索引列,但在使用read\u csv时却不必给出索引列。

Dask需要一种能够独立读取数据分区的方法。这意味着能够使用类似WHERE index_col>=val0和index_col 请注意,偏移/限制不适用于此任务,因为

对于任何给定的输入,结果通常不能得到保证。这种行为是特定于数据库实现的 通过分页while查询的结果来获得某个特定的偏移量,因此服务器需要做很多必要的工作
我发现在某些情况下,通过pd.read_sql及其chunksize参数将数据帧对象分散到集群中,最容易处理这个问题:

从dask进口袋作为db sql\u text=选择。。。 sql_meta={column0:object,column1:uint8} sql\u conn=连接。。。 dfs_futs=mapclient.scatter,将每个对象分散到簇中 pd.read\u sqlsql\u text, 康涅狄格州, chunksize=10_000,以10000个块进行迭代 columns=listsql\u meta.keys 现在将我们的块远程连接到单个帧中。 df=db.from\u sequencelistdfs\u futs.to\u dataframemeta=sql\u meta 这很好,因为您不需要处理任何潜在的驱动程序/包,这些驱动程序/包在分布式节点和/或难以轻松划分数据的情况下管理起来很麻烦


请注意性能,对于我的用例,我们利用数据库的外部表操作将数据输出到CSV,然后使用pd.read_CSV读取数据,这与上面的处理基本相同,而选择。。。从…起与Dask并行化和分块查询的方式相比,在性能方面是可以接受的,因为在数据库中执行分块是有成本的。

OK,但请注意,所有数据都是通过客户端流式传输的。至少在内存使用方面应该是可以的。正确的,这对我来说很好,因为我的客户机与我的数据库设备位于同一个数据中心内。您好@joebeeson,谢谢您的回答。我不太明白你这种做法的缺点是什么。您能澄清一下吗?缺点是您必须将所有数据从数据库传输到执行过程,然后再传输到集群。这对于任何大小的输入都是可管理的内存,因为它是分块完成的,所以块大小小于总大小memory@Rajnishkumar客户端应该是Dask调度程序的分布式.client对象。感谢您的回答!我仍然不明白为什么read\u csv方法不需要索引列。。。为什么dask不创建一个像pandas那样的默认索引表呢?另外,我想知道你给我的解决方案是什么:我不想读取没有明显索引的SQL表。所有列都是字符串,我以前不知道列中的值是什么,所以我不能定义divisions参数。然后你就走运了-dask需要一种方法来划分数据帧,这样,每个工人任务都可以独立执行。DB实现通常不提供默认的数字索引,只有当您拥有所有数据时,才可以轻松地创建该索引。