GBase 8a是一款优秀的MPP数据库,使用Python3开发ETL程序可以并行执行,并异步输出格式化的日志到文件,比传统的使用存储过程开发ETL的方式更优。
GBase 8a 提供的 GBase Python Connector可以用于操作GBase 8a数据库。本人使用的gbase8a_pythonAPI4python3.x目前的版本为3.0.1,该版本在使用中有一些问题,需要改进才能更好的使用,以下内容基于该版本。
1、端口参数
官方的接口参数一般有以下常用参数:
conn = GBaseConnector.connect(
host=host,
user=user,
password=password,
database=database,
autocommit=autocommit)
从源文件GBaseConnection.py分析可以看到,调用connect方法后调用了parsecfg方法解析参数,源代码如下:
再看一下init方法中对参数的初始化:
从源文件GBaseConnection.py中可以看到默认端口为5258,数据类型为整型。从java转过来的程序员习惯使用properties文件作为参数文件,这时候读取的参数都是字符,使用dict传递参数后,GBase 8a驱动会将数据类型自动转换,如下图所示:
因此,端口号无论是使用字符串,还是使用整型,都能正确识别。
2、connection_timeout参数
从源文件可以看出,该参数为默认为30秒,数据类型为整数。但是如果直接从properties文件加载,却不能正确识别,经过源码分析,是因为驱动程序未对该参数做类型转换,采取直接赋值的方式接收参数,如下图所示:
因此,connection_timeout参数不设置的情况下,默认就是30秒,如果ETL执行过程比较长,日志中将会出现"Lost connection to GBase server during query"的错误。
3、datetime类型数据的检索
python3.x中使用gbase 8a的驱动在检索datetime类型数据时,会报“TypeError: a bytes-like object is required, not ‘str’”的错误,经过跟踪调试,发现错误原因是datetime类型字段返回的数为bytes类型,驱动程序在执行GBaseUtils.py文件的_DATETIME_to_python方法(第321行)中的 (sd, st) = v.split(’ ')发生错误。经过分析,发现该代码在python 2.7的驱动能正确执行,但是在pyhont 3.x时,该代码应该增加数据类型转换。增加321行和322行,修改后的代码如下所示:
同样,操作date、time类型字段时,也有这样的错误,需要分别对_DATE_to_python、_TIME_to_python方法作同样的修改。
虽然GBase 8a的python驱动有一些问题,但是,瑕不掩瑜,这并不妨碍GBase 8a是一款优秀的MPP数据库。