Чтение данных большого объема из Teradata с использованием кластера Dask / Teradatasql и sqlalchemy

#python-3.x #dask #dask-distributed #dask-delayed #teradatasql

#python-3.x #dask #dask-распределенный #dask-задержка #teradatasql

Вопрос:

Мне нужно прочитать данные большого объема (записи app. 800M) из teradata, мой код работает нормально для миллиона записей. для больших наборов требуется время для создания метаданных. Не мог бы кто-нибудь подсказать, как сделать это быстрее. Ниже приведен фрагмент кода, который я использую для своего приложения.

 def get_partitions(num_partitions):
    list_range =[]
    initial_start=0
    for i in range(num_partitions):
        amp_range = 3240//num_partitions
        start = (i*amp_range 1)*initial_start
        end   = (i 1)*amp_range
        list_range.append((start,end))
        initial_start = 1
    return list_range

@delayed
def load(query,start,end,connString):
    df = pd.read_sql(query.format(start, end),connString)
    engine.dispose()
    return df

connString = "teradatasql://{user}:{password}@{hostname}/?logmech={logmech}amp;encryptdata=true"

results = from_delayed([load(query,start, end,connString) for start,end in get_partitions(num_partitions)])
 

Ответ №1:

Время сборки, вероятно, уходит на поиск метаданных вашей таблицы. Это делается путем извлечения всего первого раздела и его анализа.

Вам было бы лучше либо указать его явно, если вы заранее знаете dtypes, например, {col: dtype, ...} для всех столбцов, либо сгенерировать его из отдельного запроса, который вы ограничиваете таким количеством строк, сколько требуется, чтобы убедиться, что у вас правильные типы:

 meta = dask.compute(load(query, 0,10 ,connString))

results = from_delayed(
    [
        load(query,start, end,connString) for start,end in 
        get_partitions(num_partitions)
    ],
    mete=meta.loc[:0, :]  # zero-length version of table
)