一、簡介
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