选取文件
更新时间:2026-09-23
SelectObject 接口支持对 BOS 中指定格式(CSV/JSON/Parquet)的 Object 内容执行 SQL 语句,通过结构化查询对 Object 内容进行筛选、分析、过滤后再返回所需内容,从而减少数据传输量。相关 API 介绍见 SelectObject。
运行以下示例前,请先参考初始化完成 BOS Client 初始化,并将示例中的 bucket_name、key 替换为实际值。
说明:
select_object_args中的 SQL 语句需经过 Base64 编码后赋给expression字段。- CSV 输入/输出配置中的
recordDelimiter、fieldDelimiter、quoteCharacter、commentCharacter等分隔符同样需要 Base64 编码,例如换行符\n编码为"Cg=="、逗号,编码为"LA=="、双引号"编码为"Ig=="、井号#编码为"Iw=="。select_object返回一个SelectResponse对象,调用其result()方法获取消息生成器进行遍历。
查询 CSV 文件
Python
1from baidubce import compat
2import base64
3
4# 先上传一个简单的 CSV 文件
5csv_content = """1,Maurits,2017-09-12 16:32:57,685856330,-540265154.48,true
62,Iago,2018-02-01 12:25:01,-642946677,3781354659.89,false
73,Dionisio,2018-02-16 09:52:24,-3823711977,79336720.77,false
8"""
9bos_client.put_object_from_string(bucket_name, key, csv_content)
10
11# 设置 select_object 的参数
12select_object_args = {
13 "expressionType": "SQL",
14 "inputSerialization": {
15 "compressionType": "NONE",
16 "csv": {
17 "fileHeaderInfo": "NONE",
18 "recordDelimiter": "Cg==",
19 "fieldDelimiter": "LA==",
20 "quoteCharacter": "Ig==",
21 "commentCharacter": "Iw=="
22 }
23 },
24 "outputSerialization": {
25 "outputHeader": False,
26 "csv": {
27 "quoteFields": "ALWAYS",
28 "recordDelimiter": "Cg==",
29 "fieldDelimiter": "LA==",
30 "quoteCharacter": "Ig=="
31 }
32 },
33 "requestProgress": {
34 "enabled": True
35 }
36}
37
38# SQL 语句需经过 Base64 编码
39sql_exp = "SELECT _1, _2, _6 FROM BosObject"
40select_object_args["expression"] = compat.convert_to_string(
41 base64.standard_b64encode(compat.convert_to_bytes(sql_exp)))
42
43# 调用 select_object 并遍历结果
44select_response = bos_client.select_object(bucket_name, key, select_object_args)
45for msg in select_response.result():
46 if msg.headers["message-type"] == "Records":
47 print("type: {}, headers: {}, payload: {}, crc: {}".format(
48 msg.type, msg.headers, msg.payload, msg.crc))
49 elif msg.headers["message-type"] == "Cont":
50 print("type: {}, headers: {}, bytes_scanned: {}, bytes_returned: {}, crc: {}".format(
51 msg.type, msg.headers, msg.bytes_scanned, msg.bytes_returned, msg.crc))
52 else:
53 print("type: {}, headers: {}, crc: {}".format(msg.type, msg.headers, msg.crc))
查询 JSON 文件
Python
1from baidubce import compat
2import base64
3
4# 先上传一个简单的 JSON 文件
5json_content = """
6{
7 "name": "Smith",
8 "age": 16,
9 "weight": 65.5,
10 "org": null,
11 "projects": [
12 {"project_name": "project1", "completed": false},
13 {"project_name": "project2", "completed": true}
14 ]
15}
16"""
17bos_client.put_object_from_string(bucket_name, key, json_content)
18
19select_object_args = {
20 "expressionType": "SQL",
21 "inputSerialization": {
22 "compressionType": "NONE",
23 "json": {
24 "type": "DOCUMENT"
25 }
26 },
27 "outputSerialization": {
28 "json": {
29 "recordDelimiter": "Cg=="
30 }
31 },
32 "requestProgress": {
33 "enabled": True
34 }
35}
36
37sql_exp = "select projects from BosObject where name='Smith'"
38select_object_args["expression"] = compat.convert_to_string(
39 base64.standard_b64encode(compat.convert_to_bytes(sql_exp)))
40
41select_response = bos_client.select_object(bucket_name, key, select_object_args)
42for msg in select_response.result():
43 if msg.headers["message-type"] == "Records":
44 print("payload: {}".format(msg.payload))
查询 Parquet 文件
Python
1from baidubce import compat
2import base64
3
4# 先上传一个 Parquet 文件
5bos_client.put_object_from_file(bucket_name, key, parquet_file_name)
6
7select_object_args = {
8 "expressionType": "SQL",
9 "inputSerialization": {
10 "compressionType": "NONE",
11 "parquet": {}
12 },
13 "outputSerialization": {
14 "json": {
15 "recordDelimiter": "Cg=="
16 }
17 },
18 "requestProgress": {
19 "enabled": False
20 }
21}
22
23sql_exp = "select * from BosObject s where s.Scores.computer > 85"
24select_object_args["expression"] = compat.convert_to_string(
25 base64.standard_b64encode(compat.convert_to_bytes(sql_exp)))
26
27select_response = bos_client.select_object(bucket_name, key, select_object_args)
28for msg in select_response.result():
29 if msg.headers["message-type"] == "Records":
30 print("payload: {}".format(msg.payload))
方法说明
| 方法 | 返回值 | 说明 |
|---|---|---|
bos_client.select_object(bucket_name, key, select_object_args) |
SelectResponse |
对 Object 执行 SQL 查询,返回消息生成器。 |
评价此篇文章
