我想出了另一个解决办法。在深入研究之前,我将解释我发现了什么,以及为什么我认为Vertica DB的保存速度很慢。在Vertica日志(搜索文件)垂直木“在Vertica机器上)包含与Vertica DBs读/写相关的所有最近日志。运行write命令后,我发现这实际上是在Vertica数据库中创建INSERT语句。在
INSERT语句(没有“DIRECT”指令)速度很慢,因为它们被写入WOS(RAM)而不是ROS(磁盘)。我不知道为什么会这样。写操作发出了单独的INSERT语句
我的解决方案:
有一个documentation表示COPY命令(带有“DIRECT”关键字)是将大量数据加载到数据库的最有效方法。因为我在寻找python解决方案,所以我使用了Uber的vertica pythonpackage,它允许我与vertica数据库建立连接并发送vertica命令来执行。在
我想利用COPY命令的效率,但是数据位于Vertica集群之外的某个地方。我需要把我的Spark集群的数据发送到Vertica数据库。幸运的是,HDFS有一种方法可以做到这一点(参见here)。我决定将数据帧转换为csv文件并保存在HDFS上。然后我向Vertica数据库发送COPY命令,从HDFS获取文件。在
我的代码如下(假设我已经有一个变量来存储pyspark数据帧。我们称之为“df”):import vertica_python as VertPy
df.toPandas().to_csv(hdfs_table_absolute_filepath, header=False, index=False)
conn_info = {
'host': ['your-host-here']
'port': [port #],
'user': ['username'],
'password': ['password'],
'database': ['database']
}
conn = VertPy.connect(**conn_info)
cur = conn.cursor()
copy_command = create_copy_command(table_name, hdfs_table_relative_filepath)
cursor.execute(copy_command)
def create_copy_command(table_name, table_filepath):
copy_command = "COPY " + table_name + " SOURCE Hdfs(url='http://hadoop:50070/webhdfs/v1" + table_filepath + "', username='root') DELIMITER ',' DIRECT ABORT ON ERROR"
return copy_command