簡體   English   中英

使用 vertica-python 將 Python 熊貓數據幀轉換為 vertica 表

[英]Python pandas dataframe to vertica table using vertica-python

我正在使用 python 與 vertica 進行通信。 有沒有一種優雅的方式來創建一個帶有 Pandas 數據框的新 vertica 表。 我正在使用 vertica-python 0.6.14。 我知道的唯一方法是使用 for 循環將數據幀的每一行寫入 vertica。 在 vertica 中創建表也很痛苦,因為您需要知道每列的數據類型。 我想知道在提交 for 循環之前是否有一個簡單的解決方案來處理所有事情。

我嘗試使用以下方法:

from sqlalchemy import create_engine
engine = create_engine('vertica+vertica_python://user:pass@host:5433/MYDB')
df.to_sql('mytable', engine)

它創建了一個表但沒有填充它,我收到一條錯誤消息。

我還嘗試通過 DSN,安裝驅動程序並配置 DSN。 然后我使用了這一行:

engine = create_engine('vertica+pyodbc://username:password@mydsn')

我可以與 vertica 通信,但 pandas -> vertica 仍然無法正常工作。 有什么建議嗎?

謝謝

您可以使用 copy 語句將數據從 Pandas 數據框插入到 Vertica:

import vertica_python
conn_info = {'host': host,
             'port': port,
             'user': user,
             'password': password,
             'database': database,
             # 10 minutes timeout on queries
             'read_timeout': 600,
             # default throw error on invalid UTF-8 results
             'unicode_error': 'strict',
             # SSL is disabled by default
             'ssl': False,
             'connection_timeout': 30
             # connection timeout is not enabled by default
            }
df_csv = df.to_csv(sep=',',index=False)
cols = tuple(df.columns)
with vertica_python.connect(**conn_info) as connection:
    cur = connection.cursor('dict')
    cur.copy("""COPY yourtable {}
                from stdin DELIMITER ',' """.format(cols),
             df_csv)

為了讓它工作,我必須從 Condaforge 添加安裝 vertica-python 模塊。

Redsift、MySQL 和 MSSQL 使用簡單的連接字符串

def _get_generic_connection(self):
    """
    Creates a connection that can be used directly by the sqlalchemy library.

    Returns: A sqlalchemy database connection

    """
return create_engine(<<your connection string>>)

您必須執行以下操作

from sqlalchemy import create_engine
import vertica_python

    def _get_vertica_connection(self):
        """
        Creates a connection appropriate for HP Vertica based on the vertica_python library.

        Returns: A vertica_python database connection

        """
        conn_info = {'host': <<your host>>,
                     'port': << Vertica port>>,
                     'user': << appropriate user >>,
                     'password': << appropriate password >>,
                     'database': << your db name >>,
                     # 10 minutes timeout on queries
                     'read_timeout': 600,
                     # default throw error on invalid UTF-8 results
                     'unicode_error': 'strict',
                     # SSL is disabled by default
                     'ssl': False,
                     'connection_timeout': 300
                     # connection timeout is not enabled by default
                     }
        return vertica_python.connect(**conn_info)

我有一個具有這兩個功能的課程

def __init__(self, app_config):
    """

    Args:
        app_config( ApplicationConfiguration): Object to handle the configuration of the system
    """
    self._app_config = app_config
    self._platform = app_config.db_server.db_platform
    self._connection_function_dict = {
        "vertica": self._get_vertica_connection,
        "redshift": self._get_generic_connection,
        "mssql": self._get_generic_connection
    }

def get_db_connection(self):
    """
    Acts as the public method to retrieve a database connection for use by Pandas.
    Returns: A database connection of a type dictated by the database platform

    """
    db_connection = self._connection_function_dict[self._platform]()

    if db_connection is None:
        raise NameError("Database platform \"{}\" not known".format(self._platform))

    return db_connection

這足以產生與我們使用的任何平台的工作連接,SQLAlchemy 對這些連接感到滿意。 這意味着你可以做

pandas.read_sql(<<your SQL query>>, << your connection>>)

我有時會做一個 df.to_csv 然后

    copy_cmd = /opt/vertica/bin/vsql -U <user> -d <db> --password='password' -h <host> -c "COPY schema.table(col1,col2) FROM LOCAL 'path/to/your.csv'  PARSER fcsvparser(header='true')"

    os.system(copy_cmd)

這對我有用,如果你想捕獲異常或被拒絕的行,你也可以像這樣使用復制 cmd

     copy_cmd = /opt/vertica/bin/vsql -U <user> -d <db> --password='password' -h <host> 
     -c "COPY schema.table(col1,col2) FROM LOCAL 'path/to/your.csv'  PARSER 
     fcsvparser(header='true') DIRECT REJECTMAX 1000   EXCEPTIONS 'path/to/exception.csv' 
     REJECTED DATA 'path/to/rejected.csv'" 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM