0

Greenplum 数据库版本:PostgreSQL 8.2.15(Greenplum 数据库 4.2.3.0 build 1)

SQL Server 数据库版本:Microsoft SQL Server 2008 R2 (SP1)

我们目前的做法:

1) 将每个表从 SQL Server 导出到平面文件

2) 使用 PSQL 控制台的 psql.exe 实用程序使用 pgAdmin III 将数据加载到 Greenplum


好处...

  • 速度:好的,但是有什么更快的吗?我们在几分钟内加载数百万行数据

  • 自动化:好的,我们使用 VB 中的 Shell 脚本从 SSIS 包中调用此实用程序


陷阱...

  • 可靠性:ETL 依赖于文件服务器来保存平面文件

  • 安全性:文件服务器上有很多潜在的敏感数据

  • 错误处理:这是一个问题。psql.exe 永远不会引发我们可以捕获的错误,即使它确实出错并且不加载任何数据或部分文件


我们还尝试了什么...

.Net Providers\Odbc Data Provider:我们使用 DataDirect 6.0 Greenplum Wire Protocol 配置了系统 DSN。DELETE 的良好性能。插入的狗太慢了。

作为参考,这是前面提到的 SSIS 中的 VB 脚本...

Public Sub Main()

    Dim v_shell
    Dim v_psql As String


    v_psql = "C:\Program Files\pgAdmin III\1.10\psql.exe -d "MyGPDatabase" -h "MyGPHost" -p "5432" -U "MyServiceAccount" -f \\MyFileLocation\SSIS_load\sql_files\load_MyTable.sql"

    v_shell = Shell(v_psql, AppWinStyle.NormalFocus, True)

End Sub


这是“load_MyTable.sql”文件的内容...

\copy MyTable from '\\MyFileLocation\SSIS_load\txt_files\MyTable.txt' with delimiter as ';' csv header quote as '"'
4

1 回答 1

1

如果您要在几分钟内完成数据加载,那么当前的方法可能就足够了。但是,如果您发现自己必须加载大量数据(例如 TB 级),通常首选的批量加载到 Greenplum 的方法是 viagpfdist和相应的EXTERNAL TABLE定义。 gpload是一个不错的包装器,它为这个过程的大部分提供抽象,并由 YAML 控制文件驱动。一般的想法是,gpfdist实例在您的数据暂存的位置启动,最好是 CSV 文本文件,然后EXTERNAL TABLEGreenplum 中的定义会知道gpfdist实例的 URI。在管理指南中,此类外部表的示例定义可能如下所示:

CREATE READABLE EXTERNAL TABLE students (
name varchar(20), address varchar(30), age int)
LOCATION ('gpfdist://<host>:<portNum>/file/path/')
FORMAT 'CUSTOM' (formatter=fixedwidth_in,
name=20, address=30, age=4,
preserve_blanks='on',null='NULL');

上面的示例期望读取的文本文件的字段从左到右分别是 20 个字符(最多)的字符串、30 个字符的字符串和一个整数。要将这些数据实际加载到 GP 内的临时表中:

CREATE TABLE staging_table AS SELECT * FROM students;

对于大量数据,这应该是最有效的方法,因为所有段主机都参与并行负载。请记住,上面的简单方法可能会导致随机分布的表,这可能是不可取的。您必须自定义表定义以指定分配键。

于 2015-01-30T22:52:00.740 回答