大きなパンダのデータフレームをSQLServerデータベースに書き込む

denvaar

私は74個の比較的大きなPandasDataFrame(約34,600行と8列)を持っており、SQLServerデータベースにできるだけ早く挿入しようとしています。いくつかの調査を行った後pandas.to_sql、SQL Serverデータベースへのこのような大規模な挿入には、優れたole関数が適していないことがわかりました。これは、私が最初に行ったアプローチでした(非常に遅い-アプリケーションが完了するまでにほぼ1時間、約4分でした。 mysqlデータベースを使用します。)

この記事と他の多くのStackOverflowの投稿は、私を正しい方向に向けるのに役立ちましたが、障害にぶつかりました。

上記のリンクで説明されている理由により、ORMではなくSQLAlchemyのコアを使用しようとしています。だから、私は、辞書にデータフレームを変換し使用していますpandas.to_dictし、次にやっexecute()insert()

self._session_factory.engine.execute(
    TimeSeriesResultValues.__table__.insert(),
    data)
# 'data' is a list of dictionaries.

問題は、insertが値を取得していないことです。値は空の括弧の束として表示され、次のエラーが発生します。

(pyodbc.IntegretyError) ('23000', "[23000] [FreeTDS][SQL Server]Cannot
insert the value NULL into the column...

渡した辞書のリストに値があるので、値が表示されない理由がわかりません。

編集:

これが私が行っている例です:

def test_sqlalchemy_core(n=100000):
    init_sqlalchemy()
    t0 = time.time()
    engine.execute(
        Customer.__table__.insert(),
        [{"name": 'NAME ' + str(i)} for i in range(n)]
    )
    print("SQLAlchemy Core: Total time for " + str(n) +
        " records " + str(time.time() - t0) + " secs")
maxymoo

悲しいニュースがあります。SQLAlchemyは実際にはSQLServerの一括インポートを実装していません。実際には、実行しているのと同じ遅い個々のINSERTステートメントをto_sql実行するだけです。最善の策は、bcpコマンドラインツールを使用して何かをスクリプトで作成することです。これは私が過去に使用したスクリプトですが、保証はありません。

from subprocess import check_output, call
import pandas as pd
import numpy as np
import os

pad = 0.1
tablename = 'sandbox.max.pybcp_test'
overwrite=True
raise_exception = True
server = 'P01'
trusted_connection= True
username=None
password=None
delimiter='|'
df = pd.read_csv('D:/inputdata.csv', encoding='latin', error_bad_lines=False)



def get_column_def_sql(col):
   if col.dtype == object:
      width = col.str.len().max() * (1+pad)
      return '[{}] varchar({})'.format(col.name, int(width)) 
   elif np.issubdtype(col.dtype, float):
      return'[{}] float'.format(col.name) 
   elif np.issubdtype(col.dtype, int):
      return '[{}] int'.format(col.name) 
   else:
      if raise_exception:
         raise NotImplementedError('data type {} not implemented'.format(col.dtype))
      else:
         print('Warning: cast column {} as varchar; data type {} not implemented'.format(col, col.dtype))
         width = col.str.len().max() * (1+pad)
         return '[{}] varchar({})'.format(col.name, int(width)) 

def create_table(df, tablename, server, trusted_connection, username, password, pad):         
    if trusted_connection:
       login_string = '-E'
    else:
       login_string = '-U {} -P {}'.format(username, password)

    col_defs = []
    for col in df:
       col_defs += [get_column_def_sql(df[col])]

    query_string = 'CREATE TABLE {}\n({})\nGO\nQUIT'.format(tablename, ',\n'.join(col_defs))       
    if overwrite == True:
       query_string = "IF OBJECT_ID('{}', 'U') IS NOT NULL DROP TABLE {};".format(tablename, tablename) + query_string


    query_file = 'c:\\pybcp_tempqueryfile.sql'
    with open (query_file,'w') as f:
       f.write(query_string)

    if trusted_connection:
       login_string = '-E'
    else:
       login_string = '-U {} -P {}'.format(username, password)

    o = call('sqlcmd -S {} {} -i {}'.format(server, login_string, query_file), shell=True)
    if o != 0:
       raise BaseException("Failed to create table")
   # o = call('del {}'.format(query_file), shell=True)


def call_bcp(df, tablename):   
    if trusted_connection:
       login_string = '-T'
    else:
       login_string = '-U {} -P {}'.format(username, password)
    temp_file = 'c:\\pybcp_tempqueryfile.csv'

    #remove the delimiter and change the encoding of the data frame to latin so sql server can read it
    df.loc[:,df.dtypes == object] = df.loc[:,df.dtypes == object].apply(lambda col: col.str.replace(delimiter,'').str.encode('latin'))
    df.to_csv(temp_file, index = False, sep = '|', errors='ignore')
    o = call('bcp sandbox.max.pybcp_test2 in c:\pybcp_tempqueryfile.csv -S "localhost" -T -t^| -r\n -c')

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

パンダのデータフレームにデータを書き込むための最適な方法

分類Dev

パンダのデータフレームをMySQLに書き込む

分類Dev

パンダデータフレームの同じ行に辞書のリストを書き込む

分類Dev

パンダがcsvにデータフレーム列を書き込む

分類Dev

高速パンダデータフレームをpostgresに書き込む

分類Dev

パンダデータフレームをS3に書き込む

分類Dev

羽のファイルにパンダのデータフレームを書き込む際にエラー

分類Dev

fwfにデータフレームを書き込む際の右側のパディングスペース

分類Dev

to_sqlを使用してパンダデータフレームをOracleデータベースに書き込む方法は?

分類Dev

パンダ-1つのExcelシートに複数のデータフレームを書き込む

分類Dev

forループの出力をパンダデータフレームに書き込む

分類Dev

大きなPandasデータフレームをチャンクでCSVファイルに書き込む

分類Dev

SAS日付をSQLServerデータベースに書き込む

分類Dev

凍結されたセットの要素をパンダのデータフレームに書き込む

分類Dev

パンダ:データフレームの最初の行を垂直方向に書き込む

分類Dev

大きなパンダデータをさまざまなファイルに効率的に書き込む

分類Dev

FTPでパンダのデータフレームをcsv / xlsに直接書き込む方法

分類Dev

RデータフレームをSnowflakeデータベーステーブルに書き込む方法

分類Dev

Python:パフォーマンスの向上-別のスレッドでデータベースに書き込む

分類Dev

パンダを使用してExcelシートにデータフレーム行を書き込む

分類Dev

SSHを使用してMYSQLデータベースにPandasデータフレームを書き込む

分類Dev

大きなパンダのデータフレームを保存してExcelに

分類Dev

SparkデータフレームをNeo4jデータベースに書き込む方法

分類Dev

タイムデルタ付きのパンダデータフレームを寄木細工に書き込む

分類Dev

大きなパンダのデータフレームをSQLデータベースに送信するための最良の方法は?

分類Dev

パンダは、データフレームを書き込む前にcsvに詳細を追加する方法

分類Dev

データフレームのリストをRのCSVに書き込む

分類Dev

データフレームのリストをRのCSVに書き込む

分類Dev

大きなデータフレームをtxtファイルに書き込む

Related 関連記事

  1. 1

    パンダのデータフレームにデータを書き込むための最適な方法

  2. 2

    パンダのデータフレームをMySQLに書き込む

  3. 3

    パンダデータフレームの同じ行に辞書のリストを書き込む

  4. 4

    パンダがcsvにデータフレーム列を書き込む

  5. 5

    高速パンダデータフレームをpostgresに書き込む

  6. 6

    パンダデータフレームをS3に書き込む

  7. 7

    羽のファイルにパンダのデータフレームを書き込む際にエラー

  8. 8

    fwfにデータフレームを書き込む際の右側のパディングスペース

  9. 9

    to_sqlを使用してパンダデータフレームをOracleデータベースに書き込む方法は?

  10. 10

    パンダ-1つのExcelシートに複数のデータフレームを書き込む

  11. 11

    forループの出力をパンダデータフレームに書き込む

  12. 12

    大きなPandasデータフレームをチャンクでCSVファイルに書き込む

  13. 13

    SAS日付をSQLServerデータベースに書き込む

  14. 14

    凍結されたセットの要素をパンダのデータフレームに書き込む

  15. 15

    パンダ:データフレームの最初の行を垂直方向に書き込む

  16. 16

    大きなパンダデータをさまざまなファイルに効率的に書き込む

  17. 17

    FTPでパンダのデータフレームをcsv / xlsに直接書き込む方法

  18. 18

    RデータフレームをSnowflakeデータベーステーブルに書き込む方法

  19. 19

    Python:パフォーマンスの向上-別のスレッドでデータベースに書き込む

  20. 20

    パンダを使用してExcelシートにデータフレーム行を書き込む

  21. 21

    SSHを使用してMYSQLデータベースにPandasデータフレームを書き込む

  22. 22

    大きなパンダのデータフレームを保存してExcelに

  23. 23

    SparkデータフレームをNeo4jデータベースに書き込む方法

  24. 24

    タイムデルタ付きのパンダデータフレームを寄木細工に書き込む

  25. 25

    大きなパンダのデータフレームをSQLデータベースに送信するための最良の方法は?

  26. 26

    パンダは、データフレームを書き込む前にcsvに詳細を追加する方法

  27. 27

    データフレームのリストをRのCSVに書き込む

  28. 28

    データフレームのリストをRのCSVに書き込む

  29. 29

    大きなデータフレームをtxtファイルに書き込む

ホットタグ

アーカイブ