MAPAGGREGATE

返回从 VARCHAR 的两个输入列提供的具有键和值对的 LONG VARBINARY VMap。此函数需要 OVER 子句。

语法

MAPAGGREGATE (keys-column1, values-column2 [USING PARAMETERS param=value[,...]])

参数

keys-column
包含返回的 VMap 数据的键/值对的键的表列。值为 NULL 的键排除在外。如果存在重复键,则使用查询结果中最先出现的重复键和值,省略其他重复键和值。
values-column
包含返回的 VMap 数据的键/值对的值的表列。

参数

max_vmap_length
VMap 结果的最大字节长度,介于 1-32000000(包含)之间的整数。

默认值: 130000

on_overflow
VMap 结果大于 max_vmap_length 时的溢出行为。值必须为以下字符串之一:
  • "ERROR":发生溢出时返回错误。
  • "TRUNCATE":如果结果超过 max_vmap_length,则停止键/值对聚合。执行查询但生成的 VMap 未包含所有键/值对。当提供的 max_vmap_length 不足以存储空 VMap 时,返回的结果为 NULL。请注意,需要在 OVER 子句中指定顺序条件才能获得一致的结果。
  • 'RETURN_NULL':如果发生溢出,则返回 NULL。

默认值: 'ERROR'

示例

以下示例使用此输入表:

=> SELECT * FROM inventory;
  product     | stock
--------------+--------
  Planes      | 100
  Trains      | 50
  Automobiles | 200
(3 rows)

按如下所述的方法调用 MAPAGGREGATE,返回生成的 VMap 的 raw_map 数据:


=> SELECT raw_map FROM (SELECT MAPAGGREGATE(product, stock) OVER(ORDER BY product) FROM inventory) inventory;
raw_map
------------------------------------------------------------------------------------------------------------
\001\000\000\000\030\000\000\000\003\000\000\000\020\000\000\000\023\000\000\000\026\000\000\00020010050\003
\000\000\000\020\000\000\000\033\000\000\000!\000\000\000AutomobilesPlanesTrains
(1 row)

要将返回的 raw_map 数据转换为字符串表示形式,请使用具有 MAPTOSTRING 的 MAPAGGREGATE:


=> SELECT MAPTOSTRING(raw_map) FROM (SELECT MAPAGGREGATE(product, stock) OVER(ORDER BY product) FROM
inventory) inventory;
MAPTOSTRING
--------------------------------------------------------------
{
  "Automobiles": "200",
  "Planes": "100",
  "Trains": "50"
}
(1 row)

如果运行上述查询时将 on_overflow 保留为默认值且 max_vmap_length 小于返回的 VMap 大小,则函数返回错误消息,表示需要增加 VMap长度:


=> SELECT MAPTOSTRING(raw_map) FROM (SELECT MAPAGGREGATE(product, stock USING PARAMETERS max_vmap_length=60)
OVER(ORDER BY product) FROM inventory) inventory;
----------------------------------------------------------------------------------------------------------
ERROR 5861:  Error calling processPartition() in User Function MapAggregate at [/data/jenkins/workspace
/RE-PrimaryBuilds/RE-Build-Master_2/server/udx/supported/flextable/Dict.cpp:1324], error code: 0, message:
Exception while finalizing map aggregation: Output VMap length is too small [60]. HINT: Set the parameter
max_vmap_length=71 and retry your query

切换 on_overflow 的值可更改 MAPAGGREGATE 在溢出情况下的行为方式。例如,将 on_overflow 改为 'RETURN_NULL' 可执行上述查询并返回 NULL:


SELECT raw_map IS NULL FROM (SELECT MAPAGGREGATE(product, stock USING PARAMETERS max_vmap_length=60,
on_overflow='RETURN_NULL') OVER(ORDER BY product) FROM inventory) inventory;
?column?
----------
t
(1 row)

如果 on_overflow 设置为 'TRUNCATE',则生成的 VMap 有足够的空间容纳两个键/值对,但必须删除第三个键/值对:


SELECT raw_map IS NULL FROM (SELECT MAPAGGREGATE(product, stock USING PARAMETERS max_vmap_length=60,
on_overflow='TRUNCATE') OVER(ORDER BY product) FROM inventory) inventory;
MAPTOSTRING
---------------------------------------------
{
  "Automobiles": "200",
  "Planes": "100"
}
(1 row)

另请参阅