【发布时间】:2021-02-02 13:05:37
【问题描述】:
我一直在尝试 Superset -> Presto (PrestoSQL) -> Prometheus 组合(因为 Superset 尚不支持 Prometheus)并且在尝试从 Presto 的包含 Prometheus 的地图类型列中提取列时遇到问题标签。
为了从 Superset 的角度将必要的标签映射为列,我在 Superset 中的现有表之上创建了额外的表(或者我猜在这种情况下是一个视图),该表具有以下 SQL 来创建必要的列:
SELECT labels['system_name'] AS "system",labels['instance'] AS "instance","timestamp" AS "timestamp","value" AS "value" FROM "up"
该表随后用作 Superset 图表中的数据源,该图表将其视为子查询。由 Superset 创建然后发送到 Presto 的结果 SQL 查询看起来例如像这样:
SELECT "system" AS "system",
"instance" AS "instance",
"timestamp" AS "timestamp",
"value" AS "value"
FROM
(SELECT labels['system_name'] AS "system",
labels['instance'] AS "instance",
"timestamp" AS "timestamp",
"value" AS "value"
FROM "up") AS "expr_qry"
WHERE "timestamp" >= from_iso8601_timestamp('2020-10-19T12:00:00.000000')
AND "timestamp" < from_iso8601_timestamp('2020-10-19T13:00:00.000000')
ORDER BY "timestamp" ASC
LIMIT 250;
但是,我从上面得到的是一个错误:
io.prestosql.spi.PrestoException: Key not present in map: system_name
at io.prestosql.operator.scalar.MapSubscriptOperator$MissingKeyExceptionFactory.create(MapSubscriptOperator.java:173)
at io.prestosql.operator.scalar.MapSubscriptOperator.subscript(MapSubscriptOperator.java:143)
at io.prestosql.$gen.CursorProcessor_20201019_165636_32.filter(Unknown Source)
从 Presto 的用户指南中阅读了一些关于查询的内容后,我尝试使用 WITH:从命令行修改查询:
WITH x AS (SELECT labels['system_name'] AS "system",labels['instance'] AS "instance","timestamp" AS "timestamp","value" AS "value" FROM "up")
SELECT system, timestamp, value FROM x
WHERE "timestamp" >= from_iso8601_timestamp('2020-10-19T12:00:00.000000')
AND "timestamp" < from_iso8601_timestamp('2020-10-19T13:00:00.000000')
LIMIT 250;
这一切顺利完成。但似乎我无法定义 Superset 如何执行其查询,所以我坚持使用第一个选项。问题是,它有什么问题可以修复吗?
我猜一个选项(如果其他所有方法都失败了)是在 Presto 端定义额外的表,这将对映射列执行相同的技巧,从而有望避免上述问题。
【问题讨论】: