查询数据

我们在 Python Corpcessor 中提供了两种方法来轻松查询 GreptimeDB 的数据:

  • SQL:运行一个 SQL 字符串并返回查询结果。
  • DataFrame API:描述和执行查询的内置模块,类似于 Pandas DataFrame 或 Spark DataFrame。

SQL

使用 greptime 模块的 query 方法来检索一个查询引擎,然后调用 sql 函数来执行一个 SQL 字符串,比如:

python

1. @copr(returns=["value"])
2. def query_numbers()->vector[f64]:
3. from greptime import query
4. return query().sql("select number from numbers limit 10")[0]

通过 SQL 客户端调用它:

sql

1. SQL > select query_numbers();
2. +-----------------+
3. | query_numbers() |
4. +-----------------+
5. |               0 |
6. |               1 |
7. |               2 |
8. |               3 |
9. |               4 |
10. |               5 |
11. |               6 |
12. |               7 |
13. |               8 |
14. |               9 |
15. +-----------------+
16. 10 rows in set (1.78 sec)

sql 函数返回一个列的列表,每个列是一个值的向量。

在上面的例子中,sql("select number from numbers limit 10") 返回一个向量的列表。并使用 [0] 检索第一列向量,这就是 select SQL 中的 number 列。

查询后处理

在查询结果返回给用户之前进行处理时,协处理器就能派上用场。

例如,我们想对数值进行标准化处理:

  • 如果错过了,返回 0,而不是 null 或 NaN,
  • 如果它大于 5,返回 5,
  • 如果它小于 0,则返回 0。

然后我们可以创建 normalize.py:

python

1. import math

3. def normalize0(x):
4. if x is None or math.isnan(x):
5. return 0
6. elif x > 5:
7. return 5
8. elif x < 0:
9. return 0
10. else:
11. return x

13. @coprocessor(args=["number"], sql="select number from numbers limit 10", returns=["value"])
14. def normalize(v) -> vector[i64]:
15. return [normalize0(x) for x in v]

normalize0 函数的行为如上所述。而 normalize 函数是协处理器的入口点:

  • 执行 SQL 的 select value from demo,
  • 提取查询结果中的列 value 并将其作为 normalize 函数的参数,然后调用该函数。
  • 在函数中,使用列表理解来处理 value 向量,通过 normalize0 函数处理每个元素,
  • 返回以 value 列命名的结果。

->vector[i64] 部分指定了用于生成输出模式的返回列类型。

这个例子还展示了如何导入 stdlib 和定义其他函数(normalize0)进行调用。 normalize 协处理器将在流中被调用,查询结果可能包含多个批次,引擎将对每个批次调用协处理器。而且应该记住,从查询结果中提取的列都是向量,我们将在下一章中介绍向量。

提交并运行这个脚本将产生输出:

json

1. {
2. "output": [
3. {
4. "records": {
5. "schema": {
6. "column_schemas": [
7. {
8. "name": "value",
9. "data_type": "Int64"
10. }
11. ]
12. },
13. "rows": [
14. [0],
15. [1],
16. [2],
17. [3],
18. [4],
19. [5],
20. [5],
21. [5],
22. [5],
23. [5]
24. ]
25. }
26. }
27. ]
28. }