Задача, которую необходимо было решить:

Есть SQL сервер с базой в 1 миллиард записей, который уже не справлялся с  подготовкой отчетов по тем или иным запросам. Выполнение запросов могло быть и час и два и три.

Было решено все данные, которые хранились на SQL сервере перенести  на базу ClickHouse.

 

После недолгих поисков был  создан вот такой скрипт на языке Python. Используются специальная библиотека pandas.

Запускаем его на сервере где находится ClickHouse

 

библиотеки для Clikhouse

from sqlalchemy import create_engine

import pandas as pd

 

# engine для clickhouse. Подключаемся 

uri = 'clickhouse+native://IP адрес сервера ClickHouse:9000/Имя базы данных'

engine_click = create_engine(uri)

 

# engine для MSSQL

server = 'IP адрес SQL сервера'

database = 'База данных'

driver='driver=/opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.2.so.1.1'

user = 'имя пользователя для подключения к базе данных SQL'

password = “пароль”

engine_ms = create_engine(f'mssql+pyodbc://{user}:{password}@{server}/{database}?{driver}&Encrypt=yes&TrustServerCertificate=yes')

 

# Запрос для MSSQL. Выбираем все  из таблицы 

sql_str = '''SELECT * FROM БазаДанных.ИмяТаблицы'''

# Забираем результат порциями(чанками). Делим их по сто тысяч записей.  

df = pd.read_sql_query(sql_str, engine_ms.connect(),chunksize=100000)

for chunk in df:

# Для каждого чанка мы можем  менять типы данных, модернизировать данные, фильтровать и так далее, перед тем как отправим в ClickHouse

chunk['LogonType']=chunk['LogonType'].fillna(0)

chunk['LogonType']=chunk['LogonType'].astype('int')

# записываем порцию в ClickHouse

chunk.to_sql('AccessEvents', engine_click,  if_exists='append', index=False)

 

Копирование одного миллиарда  записей в нашем примере составила несколько часов. 

Copyright © 2024 AbakBot-online calculators. All Right Reserved. Author by Dmitry Varlamov