问题描述
我一直在摸索Superset-> Presto(Prestosql)-> Prometheus组合(因为Superset尚不支持Prometheus),并试图从包含Prometheus的Presto的地图类型列中提取列时遇到问题标签。
为了从Superset的角度将必要的标签映射为列,我在现有表的顶部的Superset中创建了额外的表(或者在这种情况下,我想是一个视图),该表具有以下用于创建必要列的sql: / p>
SELECT labels['system_name'] AS "system",labels['instance'] AS "instance","timestamp" AS "timestamp","value" AS "value" FROM "up"
此表随后用作Superset图表中的数据源,该表将其视为子查询。 Superset创建的结果SQL查询,然后发送到Presto,例如像这样:
SELECT "system" AS "system","instance" AS "instance","value" AS "value"
FROM
(SELECT labels['system_name'] AS "system","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","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端定义额外的表,这将为映射列做同样的技巧,从而希望避免上述问题。
解决方法
Presto中的地图下标运算符要求密钥必须存在于地图中。否则,您将得到描述的失败。
如果某些键可能丢失,则可以使用element_at
函数,它将返回一个NULL
结果:
返回给定
key
的值,如果键不包含在地图中,则返回NULL
。