在不使用 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

如何在不使用共享首选项的情况下将数据存储为颤动的对象[关闭]

无服务器框架:使用来自资源的存储桶的 S3 Lambda 触发器