一、简介
MaxCompute Lightning是MaxCompute产品的交互式查询服务,支持以PostgreSQL协议及语法连接访问Maxcompute项目。
正常情况下,我们使用MaxCompute表的数据是需要回流过程的,将数据回流到数据库中,然后查询数据库获取数据。然而在某些查询频率不高,查询周期不定的场景下,这种回流的方式其实不是特别适合。于是就有了交互式查询服务Lightning。
二、Lighting特点
2.1 兼容PostgreSQL语法
某种程度上,Lighting提供的就是类PostgreSQL的JDBC/ODBC接口,通过Lighting我们可以方便的像调用PostgreSQL那般调用MaxCompute的数据。
2.2 查询性能快
在小数据集下、并发场景下性能表现更好,比直接使用Maxcompute SQL走MapReduce流程快得多,接近直接调用数据库的速度。
注:按照官方工程师的说法,建议在单表1T数据量以内使用,在100GB内性能有很大提升,之后根据性能表现考虑使用Maxcompute SQL。
2.3 方便的权限管理
作为MaxCompute产品内的服务,通过Lighting接口调用数据的权限即你使用账号的权限范围。
2.4 没有维护成本,无需配置
只需为每次查询所实际处理的数据量付费,不查询时不产生费用。
三、jdbc配置
Maxcompute Lightning查询引擎基于PostgreSQL 8.2,当前仅支持对已有MaxCompute表进行SELECT查询。JDBC URL命名方式如下:
jdbc:postgresql://endpoint:port/database
参数 | 取值 | 说明 |
---|---|---|
endpoint | 所在区域不同网络环境下的Lightning访问域名 | 详情请参见访问域名,例如通过外网访问上海Region的服务使用lightning.cn-shanghai.maxcompute.aliyun.com |
port | 443 | 无 |
database | 填写MaxCompute的项目名称 | 无 |
user | 访问用户的Access Key ID | 无 |
password | 访问用户的Access Key Secret | 无 |
ssl | true | MaxCompute Lightning服务端默认开启SSL服务,客户端需要使用SSL进行连接。 |
prepareThreshold | 可选。需要使用JDBC PrepareStatement功能时, 建议设置prepareThreshold=0。 |
四、使用Python封装
为了方便使用,用Python封装该jdbc,暴露出一个连接方便使用。
在工程的合适位置新建一个
pylightning.py
,内容如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import psycopg2
class MCLightning:
def __init__(self,db):
self.endpoint = 'lightning.cn-shanghai.maxcompute.aliyun.com'
self.user = 'LTAIlgIzdyWFxxxx' #使用你申请到的账号的id和key,此处已脱敏
self.password = 'A5GPxUYB477u5lf8i2PTltqEdvxxxx'
self.port = '443'
self.db = db
def getLightningConn(self):
conn = psycopg2.connect(host = self.endpoint,user = self.user,password = self.password,port = self.port, database = self.db)
return conn
#execute
def execute(self, sql):
try:
conn = self.getLightningConn()
cursor = conn.cursor()
cursor.execute(sql)
result = cursor.fetchall()
cursor.close()
conn.close()
return result
except Exception, e:
raise Exception(e)
if '__main__' == __name__:
print('请import使用')
使用时就很简单啦:
from src.common import pylightning
s_sql = 'select xxx from table where pt=xxx'
conn = pylightning.MCLightning('project') ##project为你拥有的odps项目空间
results = conn.execute(s_sql)
for r in results:
do something