检查地图中的空键?急板

Check for null keys in map? Presto

我有一个查询 运行 现在可以正常执行以下操作:

  MAP_AGG(key, value(which is a map))
      AS k_v1,
  MAP_CONCAT(
      k_v(some map),
      MAP_UNION_SUM(
          MAP(ARRAY[K], ARRAY[V])
      ) as k_v2

来源中的一些数据如下所示:

key value k_v K V
id_2 {"KEY2": "20"} {"KEY4": "100"} KEY8 100
id_1 {"KEY1": "96.25"} {"KEY5": "150"} KEY8 150

其中它提供了一个 table 这样的:

k_v1 k_v2
{"id_2":{{"KEY2": "20"}, "id_1":{"KEY1": "96.25"}} {{"KEY4": "100"}, {"KEY5": "150"}, {"KEY8": "250"}}

但现在 运行 有了一份新工作,我收到一条错误消息

"Failure": "map key cannot be null"

我正在尝试了解如何使用 Presto 捕获这种情况,因为必须取消嵌套此类情况以检查空键的过程似乎非常冗长。是否有更简单或内置的解决方案来执行此类检查并将其从映射中删除?

编辑:我有成百上千条记录需要处理。上面的示例数据用于说明架构。

不确定是否以及您希望如何应用 unnest,但我的猜测是问题的来源是 MAP(ARRAY[K], ARRAY[V]),其中一些 KnullMAP_AGG 应该忽略空键和其他方法正在使用现有地图)。对于这种情况,您可以尝试使用条件表达式忽略此类行(通过创建空映射)- if(K is null, MAP(), MAP(ARRAY[K], ARRAY[V])):

MAP_CONCAT(
  k_v(some map),
  MAP_UNION_SUM(
      if(K is null, MAP(), MAP(ARRAY[K], ARRAY[V]))
  ) as k_v2

或用 coalesce(K, 'KEYDEFAULT'):

的默认值替换值
MAP_CONCAT(
  k_v(some map),
  MAP_UNION_SUM(
      MAP(ARRAY[coalesce(K, 'KEYDEFAULT')], ARRAY[V])
  ) as k