summary

New in version 1.30.22.

语法

summary(X,[interpolation],[characteristic],[percentile],[precision],[partitionSampling])

详情

生成数据的汇总统计信息,返回一个内存表,包含最小值、最大值、计数、均值、标准差和指定的百分位数(以升序输出)。

注意:

  • X 是表,则 summary 只统计表中数值类型的列,忽略非数值类型的列。

  • X 是数据源,则数据源只能包含数值类型的列,否则在进行 summary 统计时会报错。

参数

X 可以是内存表、DFS 表或由 sqlDS 函数生成的数据源。注意:暂不支持由 sqlDS 生成的包含表连接的数据源。

interpolation 字符串,表示计算百分位采用的插值方法,可以是 ‘linear’(默认值), ‘nearst’, ‘lower’, ‘higher’, ‘midpoint’。

characteristic 字符串标量或向量,表示需要输出的统计特征。可选值为 “avg”, “std”。若不指定该参数,则默认同时输出 “avg” 和 “std”。

percentile DOUBLE 类型向量,范围是[0,100]。默认值为 [25, 50, 75],表示返回第25, 50和75百分位数。

precision 大于0的 DOUBLE 类型标量,表示插值计算百分位时的迭代精度。默认值为 1e-3。当前计算结果与上一次迭代计算结果的差值小于等于该值时,将退出迭代。建议取值范围为[1.000e-3, 1.000e-9],若值较小,则可能因迭代次数过多而导致性能下降;若值较大,则可能导致计算的结果不精确。

partitionSampling 正整数或(0,1]之间的浮点数。正整数表示随机选取的分区个数;浮点数表示随机选取相应比例的分区。若不指定,则表示选取所有分区。指定该参数时需要注意以下事项:

  • 对于分区表:

    • 至少会选择1个分区,即当 partitionSampling 是浮点数,且 partitionSampling * 分区总个数小于1时,会选取1个分区;当 partitionSampling * 分区总个数是大于1,但不是一个整数时,则向下取整。比如partitionSampling=0.26,分区总个数为10,则会随机选取2个分区。

    • 若指定的分区个数大于实际分区数量,则会选择所有分区。

  • 对于非分区表,指定该参数不会生效;

例子

$ n=2022
$ data=1..n
$ value=take(1..3,n)
$ name=take(`APPLE`IBM`INTEL,n)
$ t=table(data,value,name);
$ summary(t, precision=0.001);
// name 非数值类型,不会输出到表中
name min max nonNullCount count avg std percentile
data 1 2,022 2,022 2,022 1,011.5 583.8454 [506.24,1011.50,1516.75]
value 1 3 2,022 2,022 2 0.8167 [1.00,1.99,2.99]
$ n = 5000
$ data1 = take(1..5000000, n)
$ data2 = rand(10000000, n)
$ data3 = take("A" + string(0..10), n)

$ t = table(data1, data2, data3)
$ dbname = "dfs://summary"
$ if(existsDatabase(dbname)) {
$     dropDatabase(dbname)
$ }
$ db = database(dbname, HASH, [INT, 10])
$ pt = createPartitionedTable(db, t, `pt, `data1)
$ pt.append!(t)

$ ds = sqlDS(<select data1,data2 from loadTable(db, `pt)>)
$ query_percentile = [25,50,75,90]

$ ds_re1 = summary(ds);
//返回第25, 50, 75, 90 百分位值
$ ds_re2 = summary(ds, percentile=query_percentile, precision=0.0001);
//分区占比为 0.6,即统计6个分区数据的信息
$ ds_re3 = summary(loadTable(db, `pt), percentile=query_percentile, precision=0.0001, partitionSampling=0.6);