更新时间:2026-01-06 GMT+08:00
分享

创建Session后下发查询并获取结果集

本示例演示创建Session后下发请求并获取结果集。

前提条件

  • Fabric SQL服务正常运行。
  • 用户提供有效的IAM认证凭据。
  • 用户已开通Fabric SQL服务并拥有访问OBS服务权限。

示例代码

from fabricsql.SQLClient import FabricSQLClient
from fabricsql.SQLRequests import SessionRequest, QueryRequest
import time
import pyarrow
# 本示例程序演示用户下发多条语句请求并且从OBS获取结果集步骤
# 用于访问的AK和SK
# 如果是临时AK/SK,还需要提供SecurityToken
ak = 'xxxxxxxxxx'
sk = 'xxxxxxxxxx'
fabric_endpoint = 'xxxxxxxxxx'
endpoint_id = 'xxxxxxxxxx'
workspaceId = 'xxxxxxxxxx'
instance_id = 'xxxxxxxxxx'
catalog = 'xxxxxxxxxx'
# 本示例代码演示用户创建一个Session,并使用该Session下发一个多条语句请求,然后获取每个语句的结果集
# 创建一个FabricSQL客户端
client = FabricSQLClient(fabric_endpoint, ak, sk)
# 创建一个Session请求,填入必要信息
s = SessionRequest()
s.endpoint_id = endpoint_id
s.instance_id = instance_id
s.catalog = catalog
# 创建一个Session,获取session_id
session = client.createSession(workspaceId, s)
session_id = session.session_id
# 创建一个SQL请求
q = QueryRequest()
q.statement = "select * from table1;select * from table2;select * from table3"
q.session_id = session_id
# 下发请求,返回一个请求响应
query_resp = client.executeQuery(workspaceId, q)
# 根据该请求响应,轮询请求结果
while True:
    statement_set = client.getSummary(workspaceId, query_resp, get_schema=False)
    print(statement_set.status_code)
    print(statement_set.headers)
    if statement_set.status == "SUCCESSFUL" or statement_set.status == "FAIL":
        break
    #等待2s后轮询
    time.sleep(2)
# 一个Statement结构体代表一个单语句的执行结果
# 如本示例中一次执行了三个单语句,故summary_list中存在3个Statement结构体
# 如果用户执行多个语句中存在某个语句执行失败,则失败语句之后的语句不会被执行,返回的list中只会包含该失败语句和之前成功语句的Statement结构体
for statement in statement_set.statements:
    # 获取单个语句结果集的列信息
    schema = statement.schema
    # 获取单个语句中列的信息,比如列名
    for col in schema:
        print(col.name)
    page_count = statement.page_count
    for page_no in range(1, page_count + 1):
        # 一个Result结构体代表单个语句一页的数据集
        result = client.getStatementResult(statement, page_num=page_no)
        # 如果FabricSQL内核写入结果集格式为JSON,则Result包含JSON格式结果集,result_set字段为数据,arrow_batch字段为None
        # 打印出JSON结果行数据
        for row in result.result_set.rows:
            print(row)
        # 如果FabricSQL内核写入结果集格式为Arrow,则Result的arrow_batch字段包含结果集的Arrow BATCH数据,result_set字段为None
        batch = result.arrow_batch
        # 注:内核不会同时写入JSON和Arrow格式数据,请确认内核GUC参数obs_result_format配置值

# 关闭一个Session
client.closeSession(workspaceId, session_id)

相关文档