【问题标题】:Presto subqueries: Key not present in mapPresto 子查询:地图中不存在键
【发布时间】: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 端定义额外的表,这将对映射列执行相同的技巧,从而有望避免上述问题。

【问题讨论】:

    标签: presto superset


    【解决方案1】:

    Presto 中的映射下标运算符要求键存在于映射中。否则,你会得到你描述的失败。

    如果某些键可能丢失,您可以改用element_at 函数,该函数将返回NULL 结果:

    返回给定key 的值,如果键不包含在映射中,则返回NULL

    【讨论】:

      猜你喜欢
      • 2020-11-22
      • 2020-09-21
      • 1970-01-01
      • 2021-12-16
      • 2017-05-01
      • 2017-04-22
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多