#python #sql #pandas #teradata #read-sql
Вопрос:
Как можно прочитать sql teradata в tempfile? Цель состоит в том, чтобы повысить производительность при вводе данных из sql-запроса в pandas df.
На https://towardsdatascience.com/optimizing-pandas-read-sql-for-postgres-f31cd7f707ab Тристан Крокетт показывает, как это делается для постгреса.
def read_sql_tmpfile(query, db_engine):
with tempfile.TemporaryFile() as tmpfile:
copy_sql = "COPY ({query}) TO STDOUT WITH CSV {head}".format(
query=query, head="HEADER"
)
conn = db_engine.raw_connection()
cur = conn.cursor()
cur.copy_expert(copy_sql, tmpfile)
tmpfile.seek(0)
df = pandas.read_csv(tmpfile)
return df
Я не мог понять, как переписать этот код, чтобы он работал с сервером teradata.
Комментарии:
1. Как синтаксис SQL
COPY
, так иcursor.copy_expert
метод зависят от postgres. Вы используетеteradatasql
драйвер для Teradata?2. Привет, Фред, спасибо за твой ответ. До сих пор я пытался использовать teradata, teradatasql и pyodbc для подключения к серверу. Я ищу аналогичное решение для КОПИРОВАНИЯ и copy_expert на Teradata.
3. Прямого эквивалента не существует. Существует
TD_SYSFNLIB.CSV
функция таблицы, которая может использоваться для преобразования базы данных в CSV, но нет метода курсора для прямой записи этого результирующего набора в файл. Вам нужно будет использовать один из методов выборки, чтобы перенести данные в память, а затем записать их в CSV. Я понятия не имею, будет ли это быстрее или медленнее в целом.4. Хорошо, большое тебе спасибо за информацию, Фред! Могу я спросить, есть ли у вас еще одно предложение по ускорению процесса выборки больших запросов? SQL Server-это teradata vantage
5. Если медлительность заключается в извлечении миллионов строк из базы данных, то текущий
teradatasql
драйвер позволяет добавить{fn teradata_require_fastexport}
escape перед оператором SELECT. Если медлительность заключается в преобразовании типов для панд (как в статье, которую вы связали), возможно, стоит попробовать промежуточный подход к CSV-файлам.