【问题标题】:Python pandas dataframe to vertica table using vertica-python使用 vertica-python 到 vertica 表的 Python pandas 数据框
【发布时间】:2017-05-10 06:57:33
【问题描述】:

我正在使用 python 与 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 仍然无法工作。有什么建议吗?

谢谢

【问题讨论】:

  • 看来你可以用this
  • 已经尝试过了,但由于某种原因我无法让它工作。认为那里可能有一些新的东西。

标签: python pandas vertica


【解决方案1】:

您可以使用复制语句将数据从 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)

【讨论】:

  • 所以在这个例子中,表必须已经在数据库中了?如果不是,Vertica 现在如何为每列分配哪些格式?
【解决方案2】:

为了让它工作,我必须从 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>>)

【讨论】:

  • 感谢您的提交。我还没有尝试过,但是扫描你的代码,它似乎是 sql-to-pandas。还是我错了。我正在尝试将 pandas 数据框放入 vertica 表中。我对这条线感到困惑pandas.read_sql(&lt;&lt;your SQL query&gt;&gt;, &lt;&lt; your connection&gt;&gt;)
【解决方案3】:

我有时会做一个 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'" 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    相关资源
    最近更新 更多