パンダto_sqlを使用してMSAzure Sqlデータベースにデータをアップロードしようとしていますが、非常に時間がかかります。私はよく寝る前にそれを実行して朝起きる必要があります、そしてそれは終わりました、しかし数時間かかりました、そして起こるエラーがあるならば私はそれに対処することができません。これが私が持っているコードです:
params = urllib.parse.quote_plus(
'Driver=%s;' % driver +
'Server=%s,1433;' % server +
'Database=%s;' % database +
'Uid=%s;' % username +
'Pwd={%s};' % password +
'Encrypt=yes;' +
'TrustServerCertificate=no;'
)
conn_str = 'mssql+pyodbc:///?odbc_connect=' + params
engine = create_engine(conn_str)
@event.listens_for(engine, 'before_cursor_execute')
def receive_before_cursor_execute(conn, cursor, statement, params, context, executemany):
if executemany:
cursor.fast_executemany = True
cursor.commit()
connection = engine.connect()
connection
次に、SQLインジェクションに対して次のコマンドを実行します。
master_data.to_sql('table_name', engine, chunksize=500, if_exists='append', method='multi',index=False)
チャンクサイズを試してみましたが、スイートスポットは100のようです。これは、通常一度に800,000〜2,000,000のレコードをアップロードしようとしていることを考えると、十分な速度ではありません。それを超えて増やすと、チャンクサイズにのみ関連しているように見えるエラーが発生します。
OperationalError: (pyodbc.OperationalError) ('08S01', '[08S01] [Microsoft][ODBC Driver 17 for SQL Server]Communication link failure (0) (SQLExecDirectW)')
問題が解決したかどうかはわかりませんが、Python固有の情報用のAzure SQLデータベースライブラリと、必要に応じてこの問題を調査および解決するためのいくつかの有用なリソースを提供するために、ここで回答を提供したいと考えました。
を使用pyodbc
してAzureSQLデータベースに直接クエリを実行する例:クイックスタート:Pythonを使用してAzureSQLデータベースのシングルインスタンスとマネージドインスタンスにクエリを実行する
Pandasデータフレームの使用例:PandasデータフレームからAzureSQLデータベースの読み取りと書き込みを行う方法
main.py
"""Read write to Azure SQL database from pandas"""
import pyodbc
import pandas as pd
import numpy as np
from sqlalchemy import create_engine
# 1. Constants
AZUREUID = 'myuserid' # Azure SQL database userid
AZUREPWD = '************' # Azure SQL database password
AZURESRV = 'shareddatabaseserver.database.windows.net' # Azure SQL database server name (fully qualified)
AZUREDB = 'Pandas' # Azure SQL database name (if it does not exit, pandas will create it)
TABLE = 'DataTable' # Azure SQL database table name
DRIVER = 'ODBC Driver 13 for SQL Server' # ODBC Driver
def main():
"""Main function"""
# 2. Build a connectionstring
connectionstring = 'mssql+pyodbc://{uid}:{password}@{server}:1433/{database}?driver={driver}'.format(
uid=AZUREUID,
password=AZUREPWD,
server=AZURESRV,
database=AZUREDB,
driver=DRIVER.replace(' ', '+'))
# 3. Read dummydata into dataframe
df = pd.read_csv('./data/data.csv')
# 4. Create SQL Alchemy engine and write data to SQL
engn = create_engine(connectionstring)
df.to_sql(TABLE, engn, if_exists='append')
# 5. Read data from SQL into dataframe
query = 'SELECT * FROM {table}'.format(table=TABLE)
dfsql = pd.read_sql(query, engn)
print(dfsql.head())
if __name__ == "__main__":
main()
そして最後に、次のリソースは、パフォーマンスの問題がある特定の実装を、スタックオーバーフロースレッドが最適なリソースである可能性が高い以下の情報と比較するのに役立ちますが、監視とパフォーマンスのチューニングドキュメントは、サーバー側のパフォーマンスの問題を調査して軽減するのに役立ちます、など。
AzureSQLデータベースとAzureSQL マネージドインスタンスでのpyODBCモニタリングとパフォーマンスチューニングのfast_executemanyを使用してpandas.DataFrame.to_sqlを高速化する
よろしく、マイク
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加