我需要通过每天发送数据来完全替换可视化工具中的大数据集。每个块一次只能发送大约30万行。
当前,我创建查询列表并将其保存为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等)以传递给我的工作人员。
限制/偏移量?键集分页?还有吗?