预先生成查询以捕获所有行(Postgres,分页?)

时间:2018-07-12 12:32:05

标签: python postgresql

我需要通过每天发送数据来完全替换可视化工具中的大数据集。每个块一次只能发送大约30万行。

  1. 在可视化工具中创建执行
  2. 生成数据块(我目前正在通过查询日期范围来完成),这些数据可以由多台计算机并行查询和发送
  3. 提交执行程序,然后按正确的顺序组合所有块(可视化工具)

当前,我创建查询列表并将其保存为Python字典。该词典保存在数据库(Airflow ETL工具)中,然后由执行单个查询的一个或多个工作人员(相同或不同的服务器)进行访问。 我以前在这里设置字符串的格式以及用于演示的完整查询,但实际上,我只保存日期并使用jinja模板。

def create_chunks(query_size=50, start_date=dt.date(2018, 1, 1), **kwargs):
    date = dt.datetime.utcnow().date()
    day_count = int(((date - start_date) / dt.timedelta(days=1)))
    offset = 0
    part = 0
    execution_list = {}
    while True:
        query_begin_date = date - dt.timedelta(days=(offset + (query_size)))
        query_end_date = date - dt.timedelta(days=(offset))
        if query_begin_date < start_date:
            query_begin_date = start_date - dt.timedelta(days=1)
        part += 1
        execution_list[part] = {}
        query = f'''SELECT * FROM schema.fact_example WHERE "date" > '{query_begin_date}' AND "date" <= '{query_end_date}' '''
        execution_list[part]['query'] = query
        offset += query_size
        if offset >= day_count:
            break
    return execution_list

因此,每个块都可以分配给将执行相应查询的工作程序:

{1: {'query': 'SELECT * FROM schema.fact_example WHERE date > \'2018-05-23\' AND date <= \'2018-07-12\' '},
 2: {'query': 'SELECT * FROM schema.fact_example WHERE date > \'2018-04-03\' AND date <= \'2018-05-23\' '},
 3: {'query': 'SELECT * FROM schema.fact_example WHERE date > \'2018-02-12\' AND date <= \'2018-04-03\' '},
 4: {'query': 'SELECT * FROM schema.fact_example WHERE date > \'2017-12-31\' AND date <= \'2018-02-12\' '}}

对于具有顺序主键(或没有日期,或日期范围之间的数据行数差异很大)的表,实现此目的的更好方法是什么?我需要预先生成查询列表(行1-300,000,行301,000-600,000等)以传递给我的工作人员。

限制/偏移量?键集分页?还有吗?

0 个答案:

没有答案