![](/img/trans.png)
[英]Python Vertica: How to use Kerberos authentication with vertica-python module?
[英]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.