1

我在红移中有超过 300 多个表。

数据每天都在更新,基本只是想知道我可以在 redshift 中创建一个 udf 来自动化 vaccum 过程。

我发现了一个使用 python 自动链接的链接,但不是我正在寻找 sql 脚本中的解决方案的那个伟大的 python 编码器。

4

5 回答 5

2

不幸的是,您不能将 udf 用于这样的事情,udf 是用于查询的简单输入/输出函数。

您最好的选择是使用 AWS 实验室的这个开源工具:VaccumAnalyzeUtility。使用这个工具的好处是它非常聪明,只VACUUM在需要它们的表上运行,它也将ANALYZE在需要它的表上运行。

设置为 cron 作业非常容易。这是如何完成的示例:

在 git 中拉取 amazon-redshift-utils 存储库:

git clone https://github.com/awslabs/amazon-redshift-utils
cd amazon-redshift-utils

创建一个可以由 cron 运行的脚本。在您的文本编辑器中创建一个名为run_vacuum_analyze.sh以下内​​容的文件,并为您的环境填写值:

export REDSHIFT_USER=<your db user name>
export REDSHIFT_PASSWORD=<your db password>
export REDSHIFT_DB=<your db>
export REDSHIFT_HOST=<your redshift host>
export REDSHIFT_PORT=<your redshift port>
export WORKSPACE=$PWD/src/AnalyzeVacuumUtility 

#
# VIRTUALENV
#

rm -rf $WORKSPACE/ve1
virtualenv -p python2.6 "$WORKSPACE/ve1"
# enter virutalenv
source $WORKSPACE/ve1/bin/activate

#
# DEPENDENCIES
#
pip install PyGreSQL

cd $WORKSPACE/run

#
# RUN IT
#
python analyze-vacuum-schema.py  --db $REDSHIFT_DB --db-user $REDSHIFT_USER --db-pwd $REDSHIFT_PASSWORD --db-port $REDSHIFT_PORT --db-host $REDSHIFT_HOST

然后创建一个将运行此脚本的 cron 作业(在此示例中,我每天凌晨 2:30 运行它)

chmod +x run_vacuum_analyze.sh
crontab -e

添加以下条目:

30 2 * * * <path-to-the-cloned-repo>/run_vacuum_analyze.sh
于 2017-11-30T16:15:15.213 回答
0

是的,我在 java 中创建了一个 AWS lamda 函数,并使用云监视事件来使用 cron 进行调度。java 中的 AWS lamda 函数需要上传阴影 jar。我在 lamda 函数中为传递给 java 处理程序的红移连接属性创建了环境变量。在此处输入图像描述

于 2018-11-01T18:09:00.397 回答
0

现在您可以使用 auto vaccum ,Redshift 现在提供此选项

于 2019-12-05T08:40:00.720 回答
0

这是我的 shell 脚本实用程序,可通过更好地控制表过滤器来自动执行此操作。

https://thedataguy.in/automate-redshift-vacuum-analyze-using-shell-script-utility/

示例命令:

对所有表运行真空和分析。

./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev 

对模式 sc1、sc2 运行真空和分析。

./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -s 'sc1,sc2'

在除模式 sc1 之外的所有模式中的所有表上运行 Vacuum FULL。但不想分析

./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -k sc1 -o FULL -a 0 -v 1

or

./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -k sc1 -o FULL -a 0

仅对除表 tb1、tbl3 之外的所有表运行分析。

./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -b 'tbl1,tbl3' -a 1 -v 0

or 

./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -b 'tbl1,tbl3' -v 0

在命令行上使用密码。

./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -P bhuvipassword

对未排序行大于 10% 的表运行真空和分析。

./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -v 1 -a 1 -x 10

or

./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -x 10

对模式 sc1 中 stats_off 大于 5 的所有表运行分析。

./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -v 0 -a 1 -f 5

仅在模式 sc1 中的表 tbl1 上运行真空,真空阈值为 90%。

./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -s sc1 -t tbl1 -a 0 -c 90

仅运行模式 sc1 分析,但设置 analyze_threshold_percent=0.01

./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -s sc1 -t tbl1 -a 1 -v 0 -r 0.01

进行一次试运行(生成 SQL 查询)以分析模式 sc2 上的所有表。

./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -s sc2 -z 1
于 2020-04-26T03:21:27.023 回答
0

You CANNOT use a UDF for this, UDFs cannot run command that update data.

于 2017-11-30T10:43:30.960 回答