在不使用 S3 存储桶的情况下将数据从远程服务器的 .gz 文件加载到 redshift 的 postgresql 实例?
Posted
技术标签:
【中文标题】在不使用 S3 存储桶的情况下将数据从远程服务器的 .gz 文件加载到 redshift 的 postgresql 实例?【英文标题】:Loading data from .gz file from remote server to postgresql instance of redshift without using S3 bucket? 【发布时间】:2016-02-16 23:08:27 【问题描述】:有没有办法将我在远程服务器中的 .gz 文件加载到 redshift 数据库表 (postgresql) 中,而无需先将其加载到 s3 存储桶中?
我看到了两个选项:-
"copy <tablename> from program "gzip -d <file location in remote server> with delimeter tab '\t' "
连接数据库后的命令。这给了我一个错误“程序处或附近的语法错误”。
无法在 python 中使用 psycopg2 库。这是为python编写的代码。
import psycopg2
import gzip
conn_string="dbname='<>' port='5439' user='<>' password='<>' host='<>'";
print "Connecting to database\n ->%s"%(conn_string)
conn=psycopg2.connect(conn_string);
cursor=conn.cursor();
with gzip.open('<gzip filelocation>','r') as l:
for line in l:
cursor.execute('copy <table_name from %s with delimiter '\t'", (line,))
谢谢。
【问题讨论】:
【参考方案1】:您可以使用 SSH 从远程主机直接COPY
。出于实际目的,这意味着远程主机需要是 *nix 机器,而不是 Windows。
但是,您仍然需要使用 S3 来存储一个清单文件,该文件指定连接详细信息和要运行的命令,例如上面的 gzip
命令。
这里的文档:COPY from Remote Host (SSH)
【讨论】:
【参考方案2】:您可以使用“INSERT”命令。您可以从 gzip 文件中读取每一行并将其插入到您的表格中。这样您就不需要 S3 存储桶,因为您没有使用“COPY”命令。例如:
with gzip.open('<gzipfile>','r') as l:
for line in l:
b=line.split('\t') # tab delimited
# Handling null values
for k in range(len(b)):
if b[k]=='\N':
b[k]=None
b=tuple(b)
sql= "INSERT INTO"+ " " + <tablename> + " VALUES (" + ",".join(["?"]*(len(b))) + ")"
cursor.execute(sql,b)
【讨论】:
这对于 Redshift 来说是一个非常糟糕的想法。您将只能充其量每秒加载约 100 行。如果这对您来说足够快,那么您可能不应该使用 Redshift。在提交之前,您至少应该建立非常大的INSERT… VALUES
语句。 docs.aws.amazon.com/redshift/latest/dg/…
确实如此。这会很慢,但这是避免 S3 的唯一方法(因为您无权访问)。有没有办法优化插入语句?还是“复制”是最好的方法?
您可以通过将许多 VALUES
行链接在一起来优化插入。 INSERT INTO a (b,c) VALUES (1,2), (3,4), (5,6), … ;
以上是关于在不使用 S3 存储桶的情况下将数据从远程服务器的 .gz 文件加载到 redshift 的 postgresql 实例?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 SDK 的情况下将文件从 Android 上传到 Amazon S3
Android:如何在不使用 PHP 或任何网络服务的情况下将数据发送到远程数据库?
如何在不下载文件的情况下搜索amazon S3存储桶中的文件内容
如何在不写入磁盘的情况下将 AWS S3 上的文本文件导入 pandas