36 KiB
toc_priority | toc_title |
---|---|
36 | 参考手册 |
参考手册
sumWithOverflow(x)
使用与输入参数相同的数据类型计算数字的总和。 如果总和超过此数据类型的最大值,则函数返回错误。
只适用于数字。
skewPop
计算的序列偏度。
skewPop(expr)
参数
expr
— 表达式 返回一个数字。
返回值
给定序列的偏度。类型 — Float64
示例
SELECT skewPop(value) FROM series_with_value_column
skewSamp
计算 样品偏度 的序列。
它表示随机变量的偏度的无偏估计,如果传递的值形成其样本。
skewSamp(expr)
参数
expr
— 表达式 返回一个数字。
返回值
给定序列的偏度。 类型 — Float64. 如果 n <= 1
(n
是样本的大小),则该函数返回 nan
.
示例
SELECT skewSamp(value) FROM series_with_value_column
uniq
计算参数的不同值的近似数量。
uniq(x[, ...])
参数
该函数采用可变数量的参数。 参数可以是 Tuple
, Array
, Date
, DateTime
, String
,或数字类型。
返回值
- A UInt64-键入号码。
实现细节
功能:
-
计算聚合中所有参数的哈希值,然后在计算中使用它。
-
使用自适应采样算法。 对于计算状态,该函数使用最多65536个元素哈希值的样本。
这个算法是非常精确的,并且对于CPU来说非常高效。如果查询包含一些这样的函数,那和其他聚合函数相比 `uniq` 将是几乎一样快。
-
确定性地提供结果(它不依赖于查询处理顺序)。
我们建议在几乎所有情况下使用此功能。
另请参阅
uniqCombined
计算不同参数值的近似数量。
uniqCombined(HLL_precision)(x[, ...])
该 uniqCombined
函数是计算不同数值数量的不错选择。
参数
该函数采用可变数量的参数。 参数可以是 Tuple
, Array
, Date
, DateTime
, String
,或数字类型。
HLL_precision
是以2为底的单元格数的对数 HyperLogLog. 可选,您可以将该函数用作 uniqCombined(x[, ...])
. 默认值 HLL_precision
是17,这是有效的96KiB的空间(2^17个单元,每个6比特)。
返回值
- 一个UInt64类型的数字。
实现细节
功能:
-
计算散列(64位散列
String
否则32位)对于聚合中的所有参数,然后在计算中使用它。 -
使用三种算法的组合:数组、哈希表和包含错误修正表的HyperLogLog。
少量的不同的值,使用数组。 值再多一些,使用哈希表。对于大量的数据来说,使用HyperLogLog,HyperLogLog占用一个固定的内存空间。
-
确定性地提供结果(它不依赖于查询处理顺序)。
!!! note "注"
因为它使用32位散列非-String
类型,结果将有非常高的误差基数显着大于 UINT_MAX
(错误将在几百亿不同值之后迅速提高),因此在这种情况下,您应该使用 uniqCombined64
相比于 uniq 功能,该 uniqCombined
:
- 消耗少几倍的内存。
- 计算精度高出几倍。
- 通常具有略低的性能。 在某些情况下,
uniqCombined
可以表现得比uniq
好,例如,使用通过网络传输大量聚合状态的分布式查询。
另请参阅
uniqCombined64
和 uniqCombined,但对所有数据类型使用64位哈希。
uniqHLL12
计算不同参数值的近似数量,使用 HyperLogLog 算法。
uniqHLL12(x[, ...])
参数
该函数采用可变数量的参数。 参数可以是 Tuple
, Array
, Date
, DateTime
, String
,或数字类型。
返回值
- A UInt64-键入号码。
实现细节
功能:
-
计算聚合中所有参数的哈希值,然后在计算中使用它。
-
使用HyperLogLog算法来近似不同参数值的数量。
212 5-bit cells are used. The size of the state is slightly more than 2.5 KB. The result is not very accurate (up to ~10% error) for small data sets (<10K elements). However, the result is fairly accurate for high-cardinality data sets (10K-100M), with a maximum error of ~1.6%. Starting from 100M, the estimation error increases, and the function will return very inaccurate results for data sets with extremely high cardinality (1B+ elements).
-
提供确定结果(它不依赖于查询处理顺序)。
我们不建议使用此功能。 在大多数情况下,使用 uniq 或 uniqCombined 功能。
另请参阅
uniqExact
计算不同参数值的准确数目。
uniqExact(x[, ...])
如果你绝对需要一个确切的结果,使用 uniqExact
功能。 否则使用 uniq 功能。
uniqExact
比 uniq
使用更多的内存,因为状态的大小随着不同值的数量的增加而无界增长。
参数
该函数采用可变数量的参数。 参数可以是 Tuple
, Array
, Date
, DateTime
, String
,或数字类型。
另请参阅
quantile
计算数字序列的近似分位数。
此功能适用 水塘抽样(,使用储存器最大到8192和随机数发生器进行采样。 结果是非确定性的。 要获得精确的分位数,请使用 quantileExact 功能。
当在一个查询中使用多个不同层次的 quantile*
时,内部状态不会被组合(即查询的工作效率低于组合情况)。在这种情况下,使用分位数功能。
语法
quantile(level)(expr)
别名: median
.
参数
level
— 分位数层次。可选参数。 从0到1的一个float类型的常量。 我们推荐level
值的范围为[0.01, 0.99]
. 默认值:0.5。 在level=0.5
该函数计算 中位数.expr
— 求职表达式,类型为:数值数据类型,日期数据类型或时间数据类型。
返回值
- 指定层次的近似分位数。
类型:
示例
输入表:
┌─val─┐
│ 1 │
│ 1 │
│ 2 │
│ 3 │
└─────┘
查询:
SELECT quantile(val) FROM t
结果:
┌─quantile(val)─┐
│ 1.5 │
└───────────────┘
另请参阅
quantileDeterministic
计算数字序列的近似分位数。
此功能适用 水塘抽样(,使用储存器最大到8192和随机数发生器进行采样。 结果是非确定性的。 要获得精确的分位数,请使用 quantileExact 功能。
当在一个查询中使用多个不同层次的 quantile*
时,内部状态不会被组合(即查询的工作效率低于组合情况)。在这种情况下,使用分位数功能。
语法
quantileDeterministic(level)(expr, determinator)
别名: medianDeterministic
.
参数
level
— 分位数层次。可选参数。 从0到1的一个float类型的常量。 我们推荐level
值的范围为[0.01, 0.99]
. 默认值:0.5。 在level=0.5
该函数计算 中位数.expr
— 求职表达式,类型为:数值数据类型,日期数据类型或时间数据类型。determinator
— 一个数字,其hash被用来代替在水塘抽样中随机生成的数字,这样可以保证取样的确定性。你可以使用用户ID或者事件ID等任何正数,但是如果相同的determinator
出现多次,那结果很可能不正确。
返回值
- 指定层次的近似分位数。
类型:
示例
输入表:
┌─val─┐
│ 1 │
│ 1 │
│ 2 │
│ 3 │
└─────┘
查询:
SELECT quantileDeterministic(val, 1) FROM t
结果:
┌─quantileDeterministic(val, 1)─┐
│ 1.5 │
└───────────────────────────────┘
另请参阅
quantileExact
准确计算数字序列的分位数。
为了准确计算,所有输入的数据被合并为一个数组,并且部分的排序。因此该函数需要 O(n)
的内存,n为输入数据的个数。但是对于少量数据来说,该函数还是非常有效的。
当在一个查询中使用多个不同层次的 quantile*
时,内部状态不会被组合(即查询的工作效率低于组合情况)。在这种情况下,使用分位数功能。
语法
quantileExact(level)(expr)
别名: medianExact
.
参数
level
— 分位数层次。可选参数。 从0到1的一个float类型的常量。 我们推荐level
值的范围为[0.01, 0.99]
. 默认值:0.5。 在level=0.5
该函数计算 中位数.expr
— 求职表达式,类型为:数值数据类型,日期数据类型或时间数据类型。
返回值
- 指定层次的分位数。
类型:
示例
查询:
SELECT quantileExact(number) FROM numbers(10)
结果:
┌─quantileExact(number)─┐
│ 5 │
└───────────────────────┘
另请参阅
quantileExactWeighted
考虑到每个元素的权重,然后准确计算数值序列的分位数。
为了准确计算,所有输入的数据被合并为一个数组,并且部分的排序。每个输入值需要根据 weight
计算求和。该算法使用哈希表。正因为如此,在数据重复较多的时候使用的内存是少于quantileExact的。 您可以使用此函数代替 quantileExact
并指定重量1。
当在一个查询中使用多个不同层次的 quantile*
时,内部状态不会被组合(即查询的工作效率低于组合情况)。在这种情况下,使用分位数功能。
语法
quantileExactWeighted(level)(expr, weight)
别名: medianExactWeighted
.
参数
level
— 分位数层次。可选参数。 从0到1的一个float类型的常量。 我们推荐level
值的范围为[0.01, 0.99]
. 默认值:0.5。 在level=0.5
该函数计算 中位数.expr
— 求职表达式,类型为:数值数据类型,日期数据类型或时间数据类型。weight
— 权重序列。 权重是一个数据出现的数值。
返回值
- 指定层次的分位数。
类型:
示例
输入表:
┌─n─┬─val─┐
│ 0 │ 3 │
│ 1 │ 2 │
│ 2 │ 1 │
│ 5 │ 4 │
└───┴─────┘
查询:
SELECT quantileExactWeighted(n, val) FROM t
结果:
┌─quantileExactWeighted(n, val)─┐
│ 1 │
└───────────────────────────────┘
另请参阅
quantileTiming
使用确定的精度计算数字数据序列的分位数。
结果是确定性的(它不依赖于查询处理顺序)。 该函数针对描述加载网页时间或后端响应时间等分布的序列进行了优化。
当在一个查询中使用多个不同层次的 quantile*
时,内部状态不会被组合(即查询的工作效率低于组合情况)。在这种情况下,使用分位数功能。
语法
quantileTiming(level)(expr)
别名: medianTiming
.
参数
-
level
— 分位数层次。可选参数。 从0到1的一个float类型的常量。 我们推荐level
值的范围为[0.01, 0.99]
. 默认值:0.5。 在level=0.5
该函数计算 中位数. -
- 如果输入负值,那结果是不可预期的。 - 如果输入值大于30000(页面加载时间大于30s),那我们假设为30000。
精度
计算是准确的,如果:
- 值的总数不超过5670。
- 总数值超过5670,但页面加载时间小于1024ms。
否则,计算结果将四舍五入到16毫秒的最接近倍数。
!!! note "注" 对于计算页面加载时间分位数,此函数比 分位数更有效和准确。
返回值
- 指定层次的分位数。
类型: Float32
.
!!! note "注"
如果没有值传递给函数(当使用 quantileTimingIf
), NaN 被返回。 这样做的目的是将这些案例与导致零的案例区分开来。 看 ORDER BY clause 对于 NaN
值排序注意事项。
示例
输入表:
┌─response_time─┐
│ 72 │
│ 112 │
│ 126 │
│ 145 │
│ 104 │
│ 242 │
│ 313 │
│ 168 │
│ 108 │
└───────────────┘
查询:
SELECT quantileTiming(response_time) FROM t
结果:
┌─quantileTiming(response_time)─┐
│ 126 │
└───────────────────────────────┘
另请参阅
quantileTimingWeighted
根据每个序列成员的权重,使用确定的精度计算数字序列的分位数。
结果是确定性的(它不依赖于查询处理顺序)。 该函数针对描述加载网页时间或后端响应时间等分布的序列进行了优化。
当在一个查询中使用多个不同层次的 quantile*
时,内部状态不会被组合(即查询的工作效率低于组合情况)。在这种情况下,使用分位数功能。
语法
quantileTimingWeighted(level)(expr, weight)
别名: medianTimingWeighted
.
参数
-
level
— 分位数层次。可选参数。 从0到1的一个float类型的常量。 我们推荐level
值的范围为[0.01, 0.99]
. 默认值:0.5。 在level=0.5
该函数计算 中位数. -
- 如果输入负值,那结果是不可预期的。 - 如果输入值大于30000(页面加载时间大于30s),那我们假设为30000。
-
weight
— 权重序列。 权重是一个数据出现的数值。
精度
计算是准确的,如果:
- 值的总数不超过5670。
- 总数值超过5670,但页面加载时间小于1024ms。
否则,计算结果将四舍五入到16毫秒的最接近倍数。
!!! note "注" 对于计算页面加载时间分位数,此函数比 分位数更高效和准确。
返回值
- 指定层次的分位数。
类型: Float32
.
!!! note "注"
如果没有值传递给函数(当使用 quantileTimingIf
), NaN 被返回。 这样做的目的是将这些案例与导致零的案例区分开来。看 ORDER BY clause 对于 NaN
值排序注意事项。
示例
输入表:
┌─response_time─┬─weight─┐
│ 68 │ 1 │
│ 104 │ 2 │
│ 112 │ 3 │
│ 126 │ 2 │
│ 138 │ 1 │
│ 162 │ 1 │
└───────────────┴────────┘
查询:
SELECT quantileTimingWeighted(response_time, weight) FROM t
结果:
┌─quantileTimingWeighted(response_time, weight)─┐
│ 112 │
└───────────────────────────────────────────────┘
另请参阅
quantileTDigest
最大误差为1%。 内存消耗 log(n)
,这里 n
是值的个数。 结果取决于运行查询的顺序,并且是不确定的。
该功能的性能低于性能 分位数 或 时间分位. 在状态大小与精度的比率方面,这个函数比 quantile
更优秀。
当在一个查询中使用多个不同层次的 quantile*
时,内部状态不会被组合(即查询的工作效率低于组合情况)。在这种情况下,使用分位数功能。
语法
quantileTDigest(level)(expr)
别名: medianTDigest
.
参数
level
— 分位数层次。可选参数。 从0到1的一个float类型的常量。 我们推荐level
值的范围为[0.01, 0.99]
. 默认值:0.5。 在level=0.5
该函数计算 中位数.expr
— 求职表达式,类型为:数值数据类型,日期数据类型或时间数据类型。
回值
- 指定层次的分位数。
类型:
示例
查询:
SELECT quantileTDigest(number) FROM numbers(10)
结果:
┌─quantileTDigest(number)─┐
│ 4.5 │
└─────────────────────────┘
另请参阅
quantileTDigestWeighted
使用t-digest 算法计算近似分位数。 该函数考虑了每个序列成员的权重。最大误差为1%。 内存消耗 log(n)
,这里 n
是值的个数。
该功能的性能低于性能 分位数 或 时间分位. 在状态大小与精度的比率方面,这个函数比 quantile
更优秀。
结果取决于运行查询的顺序,并且是不确定的。
当在一个查询中使用多个不同层次的 quantile*
时,内部状态不会被组合(即查询的工作效率低于组合情况)。在这种情况下,使用分位数功能
语法
quantileTDigest(level)(expr)
别名: medianTDigest
.
参数
level
— 分位数层次。可选参数。 从0到1的一个float类型的常量。 我们推荐level
值的范围为[0.01, 0.99]
. 默认值:0.5。 在level=0.5
该函数计算 中位数.expr
— 求职表达式,类型为:数值数据类型,日期数据类型或时间数据类型。weight
— 权重序列。 权重是一个数据出现的数值。
返回值
- 指定层次的分位数。
类型:
示例
查询:
SELECT quantileTDigestWeighted(number, 1) FROM numbers(10)
结果:
┌─quantileTDigestWeighted(number, 1)─┐
│ 4.5 │
└────────────────────────────────────┘
另请参阅
median
median*
函数是 quantile*
函数的别名。 它们计算数字数据样本的中位数。
函数:
median
— quantile别名。medianDeterministic
— quantileDeterministic别名。medianExact
— quantileExact别名。medianExactWeighted
— quantileExactWeighted别名。medianTiming
— quantileTiming别名。medianTimingWeighted
— quantileTimingWeighted别名。medianTDigest
— quantileTDigest别名。medianTDigestWeighted
— quantileTDigestWeighted别名。
示例
输入表:
┌─val─┐
│ 1 │
│ 1 │
│ 2 │
│ 3 │
└─────┘
查询:
SELECT medianDeterministic(val, 1) FROM t
结果:
┌─medianDeterministic(val, 1)─┐
│ 1.5 │
└─────────────────────────────┘
quantiles(level1, level2, …)(x)
所有分位数函数也有相应的函数: quantiles
, quantilesDeterministic
, quantilesTiming
, quantilesTimingWeighted
, quantilesExact
, quantilesExactWeighted
, quantilesTDigest
。这些函数一次计算所列层次的所有分位数,并返回结果值的数组。
varSamp(x)
计算 Σ((x - x̅)^2) / (n - 1)
,这里 n
是样本大小, x̅
是x
的平均值。
它表示随机变量的方差的无偏估计,如果传递的值形成其样本。
返回 Float64
. 当 n <= 1
,返回 +∞
.
!!! note "注"
该函数使用数值不稳定的算法。 如果你需要 数值稳定性 在计算中,使用 varSampStable
功能。 它的工作速度较慢,但提供较低的计算错误。
varPop(x)
计算 Σ((x - x̅)^2) / n
,这里 n
是样本大小, x̅
是x
的平均值。
换句话说,计算一组数据的离差。 返回 Float64
。
!!! note "注"
该函数使用数值不稳定的算法。 如果你需要 数值稳定性 在计算中,使用 varPopStable
功能。 它的工作速度较慢,但提供较低的计算错误。
stddevSamp(x)
结果等于平方根 varSamp(x)
。
!!! note "注"
该函数使用数值不稳定的算法。 如果你需要 数值稳定性 在计算中,使用 stddevSampStable
功能。 它的工作速度较慢,但提供较低的计算错误。
stddevPop(x)
结果等于平方根 varPop(x)
。
!!! note "注"
该函数使用数值不稳定的算法。 如果你需要 数值稳定性 在计算中,使用 stddevPopStable
功能。 它的工作速度较慢,但提供较低的计算错误。
topK(N)(x)
返回指定列中近似最常见值的数组。 生成的数组按值的近似频率降序排序(而不是值本身)。
实现了过滤节省空间算法, 使用基于reduce-and-combine的算法,借鉴并行节省空间.
topK(N)(column)
此函数不提供保证的结果。 在某些情况下,可能会发生错误,并且可能会返回不是最高频的值。
我们建议使用 N < 10
值,N
值越大,性能越低。最大值 N = 65536
。
参数
- ‘N’ 是要返回的元素数。
如果省略该参数,则使用默认值10。
参数
- ' x ' – 计算的频率值。
示例
就拿 OnTime 数据集来说,选择AirlineID
列中出现最频繁的三个。
SELECT topK(3)(AirlineID) AS res
FROM ontime
┌─res─────────────────┐
│ [19393,19790,19805] │
└─────────────────────┘
topKWeighted
类似于 topK
但需要一个整数类型的附加参数 - weight
. 每个输入都被记入 weight
次频率计算。
语法
topKWeighted(N)(x, weight)
参数
N
— 返回值个数。
参数
x
– 输入值。weight
— 权重。 UInt8类型。
返回值
返回具有最大近似权重总和的值数组。
示例
查询:
SELECT topKWeighted(10)(number, number) FROM numbers(1000)
结果:
┌─topKWeighted(10)(number, number)──────────┐
│ [999,998,997,996,995,994,993,992,991,990] │
└───────────────────────────────────────────┘
simpleLinearRegression
执行简单(一维)线性回归。
simpleLinearRegression(x, y)
参数:
x
— x轴。y
— y轴。
返回值:
符合y = a*x + b
的常量 (a, b)
。
例
SELECT arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [0, 1, 2, 3])
┌─arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [0, 1, 2, 3])─┐
│ (1,0) │
└───────────────────────────────────────────────────────────────────┘
SELECT arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [3, 4, 5, 6])
┌─arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [3, 4, 5, 6])─┐
│ (1,3) │
└───────────────────────────────────────────────────────────────────┘
stochasticLinearRegression
该函数实现随机线性回归。 它支持自定义参数的学习率、L2正则化系数、微批,并且具有少量更新权重的方法(Adam (默认), simple SGD, Momentum, Nesterov)。
参数
有4个可自定义的参数。 它们按顺序传递给函数,但是没有必要传递所有四个默认值将被使用,但是好的模型需要一些参数调整。
stochasticLinearRegression(1.0, 1.0, 10, 'SGD')
learning rate
当执行梯度下降步骤时,步长上的系数。 过大的学习率可能会导致模型的权重无限大。 默认值为0.00001
.l2 regularization coefficient
这可能有助于防止过度拟合。 默认值为0.1
.mini-batch size
设置元素的数量,这些元素将被计算和求和以执行梯度下降的一个步骤。 纯随机下降使用一个元素,但是具有小批量(约10个元素)使梯度步骤更稳定。 默认值为15
.method for updating weights
他们是:Adam
(默认情况下),SGD
,Momentum
,Nesterov
.Momentum
和Nesterov
需要更多的计算和内存,但是它们恰好在收敛速度和随机梯度方法的稳定性方面是有用的。
用法
stochasticLinearRegression
用于两个步骤:拟合模型和预测新数据。 为了拟合模型并保存其状态以供以后使用,我们使用 -State
combinator,它基本上保存了状态(模型权重等)。
为了预测我们使用函数 evalMLMethod,这需要一个状态作为参数以及特征来预测。
1. 安装
可以使用这种查询。
CREATE TABLE IF NOT EXISTS train_data
(
param1 Float64,
param2 Float64,
target Float64
) ENGINE = Memory;
CREATE TABLE your_model ENGINE = Memory AS SELECT
stochasticLinearRegressionState(0.1, 0.0, 5, 'SGD')(target, param1, param2)
AS state FROM train_data;
在这里,我们还需要将数据插入到 train_data
桌子 参数的数量不是固定的,它只取决于参数的数量,传递到 linearRegressionState
. 它们都必须是数值。
请注意,带有目标值的列(我们想要学习预测)被插入作为第一个参数。
2. 预测
在将状态保存到表中之后,我们可以多次使用它进行预测,甚至与其他状态合并并创建新的更好的模型。
WITH (SELECT state FROM your_model) AS model SELECT
evalMLMethod(model, param1, param2) FROM test_data
查询将返回一列预测值。 请注意,第一个参数 evalMLMethod
是 AggregateFunctionState
对象,接下来是要素列。
test_data
是一个像表 train_data
但可能不包含目标值。
注
-
要合并两个模型,用户可以创建这样的查询:
sql SELECT state1 + state2 FROM your_models
哪里your_models
表包含这两个模型。 此查询将返回newAggregateFunctionState
对象。 -
如果没有,用户可以获取创建的模型的权重用于自己的目的,而不保存模型
-State
使用combinator。sql SELECT stochasticLinearRegression(0.01)(target, param1, param2) FROM train_data
这种查询将拟合模型并返回其权重-首先是权重,它对应于模型的参数,最后一个是偏差。 所以在上面的例子中,查询将返回一个具有3个值的列。
另请参阅
stochasticLogisticRegression
该函数实现随机逻辑回归。 它可以用于二进制分类问题,支持与stochasticLinearRegression相同的自定义参数,并以相同的方式工作。
参数
参数与stochasticLinearRegression中的参数完全相同:
learning rate
, l2 regularization coefficient
, mini-batch size
, method for updating weights
.
欲了解更多信息,请参阅 参数.
stochasticLogisticRegression(1.0, 1.0, 10, 'SGD')
1. 安装
参考stochasticLinearRegression相关文档
预测标签的取值范围为[-1, 1]
2. 预测
使用已经保存的state我们可以预测标签为 `1` 的对象的概率。
``` sql
WITH (SELECT state FROM your_model) AS model SELECT
evalMLMethod(model, param1, param2) FROM test_data
```
查询结果返回一个列的概率。注意 `evalMLMethod` 的第一个参数是 `AggregateFunctionState` 对象,接下来的参数是列的特性。
我们也可以设置概率的范围, 这样需要给元素指定不同的标签。
``` sql
SELECT ans < 1.1 AND ans > 0.5 FROM
(WITH (SELECT state FROM your_model) AS model SELECT
evalMLMethod(model, param1, param2) AS ans FROM test_data)
```
结果是标签。
`test_data` 是一个像 `train_data` 一样的表,但是不包含目标值。
另请参阅