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

24 阅读1分钟

概述

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"

脚本执行示例