定期运行 Redshift 查询

Posted

技术标签:

【中文标题】定期运行 Redshift 查询【英文标题】:Run Redshift Queries Periodically 【发布时间】:2018-03-21 14:23:36 【问题描述】:

我已经开始研究 Redshift。它在 AWS 中被定义为“数据库”服务。根据我目前所学到的,我们可以创建表并将数据从 S3 或从 Hive 等外部源提取到 Redhshift 数据库(集群)中。另外,我们可以使用 JDBC 连接来查询这些表。

我的问题是 -

    Redshift 集群中是否有一个地方可以存储我们定期运行的查询(如 Daily)?

    我们可以将查询存储在 S3 位置并使用它来创建到另一个 S3 位置的输出吗?

    我们能否将包含二进制和字符串字段混合的 DB2 表卸载文件直接加载到 Redshift,或者我们是否需要一个中间过程来将数据转换为 CSV 之类的东西?

我已经对此进行了一些谷歌搜索。如果您有资源链接,那将非常有帮助。谢谢你。

【问题讨论】:

docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html @JohnHanley 感谢您的回复。我知道 Redshift 中的查询结果可以卸载到 S3 中。我的问题更多是关于我们实际存储查询的位置(我们可以将它存储在任何 AWS 服务中,如 S3 或 Redshift 集群本身),而不是结果。谢谢。 【参考方案1】:

我使用cursor 方法在python 中使用psycopg2 函数。示例代码如下。您必须在 env_vars 文件中设置所有红移凭据。 您可以使用cursor.execute 设置您的查询。这里我提到一个更新查询,所以你可以在这个地方设置你的查询(你可以设置多个查询)。之后,您必须将此 python 文件设置为 crontab 或任何其他自动运行应用程序,以便定期运行您的查询。

import psycopg2
import sys
import env_vars

conn_string = "dbname=%s  port=%s  user=%s  password=%s  host=%s " %(env_vars.RedshiftVariables.REDSHIFT_DW ,env_vars.RedshiftVariables.REDSHIFT_PORT ,env_vars.RedshiftVariables.REDSHIFT_USERNAME ,env_vars.RedshiftVariables.REDSHIFT_PASSWORD,env_vars.RedshiftVariables.REDSHIFT_HOST)
conn = psycopg2.connect(conn_string);
cursor = conn.cursor();
cursor.execute("""UPDATE database.demo_table SET  Device_id = '123' where Device = 'IPHONE' or Device = 'Apple'; """);

conn.commit();
conn.close();

【讨论】:

不用担心,如果您不熟悉 python,您只需设置凭据并将查询放入 cursor.execute 其余代码保持不变。

以上是关于定期运行 Redshift 查询的主要内容,如果未能解决你的问题,请参考以下文章

Redshift 终止长时间运行的查询

Redshift 物化视图不刷新或删除

是否可以在 Redshift 中并行运行查询?

Redshift:查询结果缓存与查询编译缓存

如何运行存储在 Redshift 表中的 SQL 查询

Redshift 查询花费太多时间