【问题标题】:Dask - load dataframe from SQL without specifying index_colDask - 从 SQL 加载数据帧而不指定 index_col
【发布时间】:2020-05-25 05:13:21
【问题描述】:

我正在尝试从 SQL 连接加载 Dask 数据帧。根据read_sql_table documentation,有必要传入一个 index_col。如果没有好的列可以作为索引,我该怎么办?

这会是一个合适的替代品吗?

# Break SQL Query into chunks
chunks = []
num_chunks = math.ceil(num_records / chunk_size)

# Run query for each chunk on Dask workers
for i in range(num_chunks):
    query = 'SELECT * FROM ' + table + ' LIMIT ' + str(i * chunk_size) + ',' + str(chunk_size)
    chunk = dask.delayed(pd.read_sql)(query, sql_uri)
    chunks.append(chunk)

# Aggregate chunks
df = dd.from_delayed(chunks)
dfs[table] = df

【问题讨论】:

    标签: dask dask-distributed dask-delayed dask-dataframe


    【解决方案1】:

    不幸的是,在大多数 SQL 实现中,LIMIT/OFFSET 通常不是划分查询的可靠方法。特别是,通常情况下,为了获得一个偏移量并从查询中获取后面的行,引擎必须首先解析较早的行,因此生成多个分区的工作被放大了很多。在某些情况下,您甚至可能会丢失或重复行。 这就是在 dask sql 实现中需要边界值的原因。

    但是,您设置 dask 数据框的方式原则上没有任何问题。如果您可以证明您的服务器没有遇到我们预期的问题,那么欢迎您采用这种方法。

    【讨论】:

    • 啊,我明白了,那么是否有另一种推荐/更可靠的方法可以在不使用 LIMIT/OFFSET 的情况下执行此操作?谢谢!
    • 使用索引 :) 说真的,无论是从 Dask 的角度,从可靠的查询构造和执行的角度来看,还是从数据库引擎的角度来看,使用索引都是要走的路。当然,您可以指定一个不在数据库中索引的 index_col,但性能会受到影响。
    • (我的意思是,每个分区都由一些 WHERE val <= COL < val 挑选,这是 read_sql_table 内部所做的)
    • 我明白了,谢谢你的帮助!作为一个后续问题,由于 Dask 的 read_sql_table 为每个分区设置单独的连接的方式,当 Dask 工作人员正在查询表时,是否有可能将新记录插入到表中,从而导致表的视图不一致?
    • 我认为没有任何方法可以指定“在 X 时对数据执行此查询”,是的,确实有些分区可能包含新数据而其他分区不包含,但至少我们保证分区中的每一行确实满足其边界条件。
    猜你喜欢
    • 1970-01-01
    • 2020-01-01
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多