GBASE南大通用技术分享:GBase 8a标准加载协议替代GreenPlum管道加载的迁移方案

概述
GreenPlum(Postgresql) 的copy命令支持将操作系统的STDIN作为输入,通过 '|' 管道的方式进行数据加载。例如如下的例子:

echo -e "1\n2\n3" | psql -d yourdatabase -c "COPY yourtable FROM STDIN WITH (FORMAT csv);"

cat filename.csv | psql -d yourdatabase -c "COPY yourtable FROM STDIN WITH (FORMAT csv);"

python myscript.py | psql -d yourdatabase -c "COPY yourtable FROM STDIN WITH (FORMAT csv);"

GBase 8a MPP Cluster目前暂不支持管道方式进行数据加载,本文中介绍一种脚本封装GBase 8a支持的标准加载协议方式平替管道加载的方案。

脚本的大体思路是:

1、从操作系统的STDIN中读取数据并落地为临时文件;

2、通过GBase 8a支持的加载协议将落地的临时数据文件加载至8a中;

3、加载完成后删除临时文件。

脚本示例

/bin/bash

set -euo pipefail

tbname=$1

定义临时文件名

TEMP_FILE="pipe_data_$(date +%Y%m%d%H%M%S).tmp"

定义sftp连接信息

SFTP_SERVER="sftp://gbase:Admin2o11o531@192.168.56.162"

定义临时文件落地目录

TEMP_FILE_PATH="/home/gbase"

检查是否有管道输入

if [ -t 0 ]; then
echo "错误:未检测到管道输入,请使用管道传递数据(例如:cat filename.txt | $0)"
exit 1
fi

从标准输入(管道)读取并写入临时文件

cat - > "$TEMP_FILE"

验证临时文件是否生成且非空

if [ ! -f "$TEMP_FILE" ] || [ ! -s "$TEMP_FILE" ]; then
echo "错误:临时文件生成失败或为空"
rm -f "$TEMP_FILE" # 清理无效文件
exit 1
fi

gccli -uroot -pAdmin2O11O531 -Dtest -e"load data infile '$SFTP_SERVER$TEMP_FILE_PATH/$TEMP_FILE' into table $tbname fields terminated by '|'"

检查加载结果

if [ $? -eq 0 ]; then
echo "数据加载成功!"
else
echo "错误:数据加载失败"
rm -f "$TEMP_FILE"
exit 1
fi

清理临时文件

rm -f "$TEMP_FILE"

脚本执行示例

image

posted @ 2025-08-05 17:01  GBASE南大通用  阅读(7)  评论(0)    收藏  举报