Presto子查询:密钥在地图中不存在

问题描述

我一直在摸索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