转换数据
流式表达式提供了一组强大的函数来转换结果集。本用户指南的这一部分概述了应用于结果集的有用转换。
选择和添加字段
select
函数包装另一个流式表达式,可以对流中的每个元组执行以下操作
-
选择字段的子集
-
将字段映射到新名称
-
计算新字段
下面是一个示例,显示 select
函数包装 search
函数并将字段映射到新字段名称。recNum
函数是一个数学表达式,它只返回元组的当前记录号。select
表达式可以调用任何数学表达式来计算新值。
下面是一个示例,使用 div
函数从两个现有字段计算新字段
处理 Null 值
notNull
和 isNull
函数可用于将 null 值替换为不同的值,或者筛选出具有 null 值的元组。
下面的示例在 select
函数内部使用 isNull
函数将 null 值替换为 -1。if
函数接受 3 个参数。第一个是布尔表达式,在这种情况下为 isNull
。如果布尔函数返回 true,则 if
函数返回第二个参数,如果返回 false,则返回第三个参数。在本例中,isNull
始终为 true,因为它正在检查元组中未包含在结果集中的字段。
notNull
和 isNull
也可以与 having
函数一起使用,以筛选出具有 null 值的元组。
下面的示例发出所有文档,因为它正在为不在结果集中的字段评估 isNull
,该字段始终返回 true。
下面的示例发出零个文档,因为它正在为不在结果集中的字段评估 notNull
,该字段始终返回 false。
正则表达式匹配和筛选
matches
函数可以在 having
函数内部使用,以测试记录中的字段是否与特定的正则表达式匹配。这允许对搜索结果进行复杂的正则表达式匹配。
下面的示例使用 matches
函数返回 complaint_type_s
字段以 Commercial 结尾的所有记录。
汇总
rollup
和 hashRollup
函数可用于对结果集执行聚合操作。这与使用 JSON facet API 将聚合操作推送到搜索引擎中的 facet
、facet2D
和 timeseries
聚合函数不同。
rollup
函数执行 Map-Reduce 样式的汇总,这要求结果流按分组字段排序。 这允许对非常高基数的字段进行聚合。 hashRollup
函数执行汇总,将所有桶保留在内存中的哈希映射中。 这需要足够的内存来存储内存中所有不同的分组依据字段,但不要求底层流被排序。
下面的示例展示了来自 nyc311
投诉数据库随机样本的前 5 种投诉类型的可视化。 top
函数用于根据 hashRollup
输出的 count(*)
字段选择前 5 种投诉类型。