概述
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"