例如,在本例中,查看到数据文件的OBS路径分别为:
https://obs.cn-north-1.myhuaweicloud.com/mybucket/demo.db/product_info_orc/product_info.0 https://obs.cn-north-1.myhuaweicloud.com/mybucket/demo.db/product_info_orc/product_info.1
步骤3 为用户设置OBS桶的读取权限。
在使用SQL on OBS功能时,执行该功能的用户需要取得数据源文件所在OBS桶的读取 权限。通过配置桶的ACL权限,可以将读取权限授予指定的用户帐号。
具体请参见《对象存储服务控制台指南》中的配置桶ACL章节。
----结束
3.2.3.2 创建外部服务器
创建外部服务器,用于定义OBS服务器的信息,供外表调用。创建外部服务器的详细 语法,请参见CREATE SERVER。
(可选)新建用户及数据库并授予外表权限
如果您将使用普通用户在自定义数据库中创建外部服务器和外表,由于普通用户没有 外表权限无法创建,所以,您必须参照以下步骤新建用户和数据库,并授予该用户外 表权限。
以下示例,是新建一个普通用户dbuser并创建一个数据库mydatabase,然后使用管理 员用户授予dbuser外表权限。
步骤1 使用数据库管理员通过GaussDB(DWS)提供的数据库客户端连接默认数据库gaussdb。
例如,使用gsql客户端的用户执行下面命令连接数据库:
gsql -d gaussdb -h 192.168.2.30 -U dbadmin -p 8000 -W password -r
步骤2 新建一个普通用户,并用它创建一个数据库。
新建一个具有创建数据库权限的用户dbuser:
CREATE USER dbuser WITH CREATEDB PASSWORD 'password';
切换为新建的用户:
SET ROLE dbuser PASSWORD 'password';
执行以下命令创建数据库:
CREATE DATABASE mydatabase;
查询数据库:
SELECT * FROM pg_database;
返回结果中有mydatabase 的信息表示创建成功:
datname | datdba | encoding | datcollate | datctype | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace | datcompatibility | datacl
---+---+---+---+---+---+---+---+---
++-+----+---
template1 | 10 | 0 | C | C | t | t | -1 | 14146 | 1351
| 1663 | ORA | {=c/omm,omm=CTc/omm}
template0 | 10 | 0 | C | C | t | f | -1 | 14146 | 1350
| 1663 | ORA | {=c/omm,omm=CTc/omm}
gaussdb | 10 | 0 | C | C | f | t | -1 | 14146 | 1352 | 1663 | ORA | {=Tc/omm,omm=CTc/omm,chaojun=C/omm,hu
obinru=C/omm}
mydatabase | 17000 | 0 | C | C | f | t | -1 | 14146 | 1351
| 1663 | ORA | (4 rows)
步骤3 使用管理员用户给普通用户赋予创建外部服务器的权限和使用外表的权限。
使用数据库管理员用户通过GaussDB(DWS)提供的数据库客户端连接新建的数据库。
例如,使用gsql客户端的用户可以直接使用如下语句切换为管理员用户去连接新建的 数据库:
\c mydatabase dbadmin;
根据提示输入管理员用户密码。
说明
注意,必须先使用管理员用户连接到将要创建外部服务器和使用外表的数据库,再对普通用户进 行授权。
默认只有系统管理员才可以创建外部服务器,普通用户需要授权才可以创建,执行以 下命令授权:
GRANT ALL ON SCHEMA public TO dbuser;
GRANT ALL ON FOREIGN DATA WRAPPER dfs_fdw TO dbuser;
其中fdw_name的名字可以是hdfs_fdw或者dfs_fdw,dbuser为创建SERVER的用户 名。
执行以下命令赋予用户使用外表的权限。
ALTER USER dbuser USEFT;
查看用户:
SELECT r.rolname, r.rolsuper, r.rolinherit, r.rolcreaterole, r.rolcreatedb, r.rolcanlogin, r.rolconnlimit, r.rolvalidbegin, r.rolvaliduntil, ARRAY(SELECT b.rolname
FROM pg_catalog.pg_auth_members m
FROM pg_catalog.pg_roles r ORDER BY 1;
返回结果中dbuser的信息中包含了UseFT权限,表示授权成功:
rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolconnlimit | rolvalidbegin | rolvaliduntil | memberof | rolreplication | rolauditadmin | rolsystemadmin | roluseft
\c mydatabase dbuser;
根据提示输入密码。
● 如果尚未登录gsql客户端,或者已经登录了gsql客户端执行\q退出gsql后,执行以 下命令重新进行连接:
gsql -d mydatabase -h 192.168.2.30 -U dbuser -p 8000 -r
根据提示输入密码。
步骤2 创建外部服务器。
创建外部服务器的详细语法,请参见CREATE SERVER。
例如,执行以下命令创建外部服务器'obs_server' :
CREATE SERVER obs_server FOREIGN DATA WRAPPER dfs_fdw OPTIONS (
address 'obs.cn-north-1.myhuaweicloud.com' , ACCESS_KEY 'access_key_value_to_be_replaced',
SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced', encrypt 'on',
type 'obs' );
以下为必选参数的说明:
● 外部服务器名称 允许用户自定义名字。
在本例中,我们指定为“obs_server” 。
● FOREIGN DATA WRAPPER
fdw_name的名字可以是hdfs_fdw或者dfs_fdw,它在数据库中已经存在。
● OPTIONS参数 – address
指定OBS服务的终端节点。
address的获取方法如下:
i. 先通过OBS上的数据准备中的2获取OBS路径。
ii. 在OBS上查看到的OBS的终端节点:obs.xxx.myhuaweicloud.com。
– 访问密钥(AK和SK)(必选)
GaussDB(DWS)需要通过访问密钥(AK和SK)访问OBS,因此,必须先获取 访问密钥。
▪
“access_key”(必选):表示用户的AK信息。▪
“secret_access_key”(必选):表示用户的SK信息。获取访问密钥的具体步骤,请参见创建访问密钥(AK和SK)。
– type
取值为'obs',表示dfs_fdw连接的是OBS。
步骤3 查看外部服务器:
SELECT * FROM pg_foreign_server WHERE srvname='obs_server';
返回结果如下所示,表示已经创建成功:
srvname | srvowner | srvfdw | srvtype | srvversion | srvacl
| srvoptions
---+---+---+---+---+--- +---
----
obs_server | 24661 | 13686 | | | |
{address=xxx.xxx.x.xxx,access_key=xxxxxxxxxxxxxxxxxxxx,type=obs,secret_access_key=xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxx}
(1 row)
----结束
3.2.3.3 创建外表
当完成创建外部服务器后,在GaussDB(DWS)数据库中创建一个OBS外表,用来访问 存储在OBS上的数据。OBS外表是只读的,只能用于查询操作,可直接使用SELECT查 询其数据。
创建外表
创建外表的语法格式如下,详细的描述请参见CREATE FOREIGN TABLE (SQL on Hadoop or OBS)。
CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [ { column_name type_name
[ { [CONSTRAINT constraint_name] NULL | [CONSTRAINT constraint_name] NOT NULL | column_constraint [...]} ] |
table_constraint [, ...]} [, ...] ] ) SERVER dfs_server
OPTIONS ( { option_name ' value ' } [, ...] ) DISTRIBUTE BY {ROUNDROBIN | REPLICATION}
[ PARTITION BY ( column_name ) [ AUTOMAPPED ] ] ;
例如,创建一个名为"product_info_ext_obs"的外表,对语法中的参数按如下描述进行 设置:
● table_name 外表的表名。
● 表字段定义
– column_name:外表中的字段名。
– type_name:字段的数据类型。
多个字段用“,”隔开。
外表的字段个数和字段类型,需要与OBS上保存的数据完全一致。
● SERVER dfs_server
外表的外部服务器名称,这个server必须存在。外表通过设置外部服务器连接OBS 读取数据。
此处应填写为参照创建外部服务器创建的外部服务器名称。
● OPTIONS 参数
用于指定外表数据的各类参数,关键参数如下所示。
– “format”:表示对应的OBS服务上的文件格式,支持“orc”、
“carbondata”格式。
– “foldername”:必选参数。数据源文件的OBS路径,此处仅需要填写“/桶 名/文件夹目录层级/”。
可以先通过OBS上的数据准备中的2获取数据源文件的完整的OBS路径,该路 径为OBS的终端节点(Endpoint)。
– “totalrows”:可选参数。该参数不是导入的总行数。由于OBS上文件可能 很多,做analyze可能会很慢,通过“totalrows”参数,让用户来设置一个预 估的值,使优化器能通过这个值做大小表的估计。一般预估值与实际值的数 量级差不多时,查询效率较高。
– “encoding”:外表中数据源文件的编码格式名称,缺省为utf8。对于OBS 外表此参数为必选项。
● DISTRIBUTE BY:
这个子句是必须的,对于OBS外表,当前只支持ROUNDROBIN分布方式。
表示外表在从数据源读取数据时,GaussDB(DWS)集群每一个节点随机读取一部 分数据,并组成完整数据。
● 语法中的其他参数
其他参数均为可选参数,用户可以根据自己的需求进行设置,在本例中我们不需 要设置。
根据以上信息,创建外表命令如下所示:
DROP FOREIGN TABLE IF EXISTS product_info_ext_obs;
---建立不包含分区列的OBS外表,表关联的外部服务器为obs_server,表对应的OBS服务上的文件格式为
‘orc’,OBS上的数据存储路径为'/mybucket/data/'。
CREATE FOREIGN TABLE product_info_ext_obs ( product_price integer not null, product_id char(30) not null, product_time date , product_level char(10) , product_name varchar(200) , product_type1 varchar(20) , product_type2 char(10) , product_monthly_sales_cnt integer , product_comment_time date , product_comment_num integer ,
product_comment_content varchar(200) ) SERVER obs_server
OPTIONS ( format 'orc',
foldername '/mybucket/demo.db/product_info_orc/', encoding 'utf8',
totalrows '10'
) DISTRIBUTE BY ROUNDROBIN;
3.2.3.4 通过外表查询 OBS 上的数据 直接查询外表查看 OBS 上的数据
如果数据量较少,可直接使用SELECT查询外表,即可查看到OBS上的数据。
步骤1 执行以下命令,则可以从外表查询数据。
SELECT * FROM product_info_ext_obs;
查询结果显示与原始数据显示相同,则表示导入成功。查询结果的结尾将显示以下信 息:
(10 rows)
通过外表查询到数据后,用户可以将数据插入数据库的普通表。
----结束