blob: 2ae36a25a866d42bad54edf0fac99259969b7e0b [file] [log] [blame]
/* ----------------------------------------------------------------------- *//**
*
* @file sketch.sql_in
*
* @brief SQL functions for sketch-based approximations of descriptive statistics
* @date April 2011
*
* @sa For a brief introduction to sketches, see the module description grp_sketches
*
*//* ----------------------------------------------------------------------- */
m4_include(`SQLCommon.m4')
/**
@addtogroup grp_sketches
@brief A collection of methods to estimate the number of unique values contained in the data.
Sketches (sometimes called "synopsis data structures") are small randomized
in-memory data structures that capture statistical properties of a large set
of values (e.g., a column of a table). Sketches can be formed in a single
pass of the data, and used to approximate a variety of descriptive statistics.
We implement sketches as SQL User-Defined Aggregates (UDAs). Because they are
single-pass, small-space and parallelized, a single query can use many sketches
to gather summary statistics on many columns of a table efficiently.
This module currently implements user-defined aggregates based on three main sketch methods:
- <i>Count-Min (CM)</i> sketches, which can be used to approximate a number of descriptive statistics including
- <c>COUNT</c> of rows whose column value matches a given value in a set
- <c>COUNT</c> of rows whose column value falls in a range (*)
- order statistics including <i>median</i> and <i>centiles</i> (*)
- <i>histograms</i>: both <i>equi-width</i> and <i>equi-depth</i> (*)
- <i>Flajolet-Martin (FM)</i> sketches for approximating <c>COUNT(DISTINCT)</c>.
- <i>Most Frequent Value (MFV)</i> sketches, which output the most
frequently-occuring values in a column, along with their associated counts.
<i>Note:</i> Features marked with a star (*) only work for discrete types that
can be cast to int8.
The sketch methods consist of a number of SQL UDAs (user-defined aggregates)
and UDFs (user-defined functions), to be used directly in SQL queries.
*/
/**
@addtogroup grp_fmsketch
<div class="toc"><b>Contents</b>
<ul>
<li><a href="#syntax">Syntax</a></li>
<li><a href="#examples">Examples</a></li>
<li><a href="#literature">Literature</a></li>
<li><a href="#related">Related Topics</a></li>
</ul>
</div>
@brief Implements Flajolet-Martin's distinct count estimation
as a user-defined aggregate.
\ref fmsketch_dcount can be run on a column of any type.
It returns an approximation to the number of distinct values
(a la <c>COUNT(DISTINCT x)</c>), but faster and approximate.
Like any aggregate, it can be combined with a GROUP BY clause to do distinct
counts per group.
@anchor syntax
@par Syntax
Get the number of distinct values in a designated column.
<pre class="syntax">
fmsketch_dcount( col_name )
</pre>
@note This is a [User Defined Aggregate](https://www.postgresql.org/docs/current/static/xaggr.html)
which returns the results when used in a query. Use "CREATE TABLE AS ", with the
UDA as subquery if the results are to be stored. This is unlike the usual MADlib
stored procedure interface which places the results in a table instead of
returning it.
@anchor examples
@examp
-# Generate some data.
<pre class="example">
CREATE TABLE data(class INT, a1 INT);
INSERT INTO data SELECT 1,1 FROM generate_series(1,10000);
INSERT INTO data SELECT 1,2 FROM generate_series(1,15000);
INSERT INTO data SELECT 1,3 FROM generate_series(1,10000);
INSERT INTO data SELECT 2,5 FROM generate_series(1,1000);
INSERT INTO data SELECT 2,6 FROM generate_series(1,1000);
</pre>
-# Find the distinct number of values for each class.
<pre class="example">
SELECT class, fmsketch_dcount(a1)
FROM data
GROUP BY data.class;
</pre>
Result:
<pre class="result">
class | fmsketch_dcount
&nbsp;------+-----------------
2 | 2
1 | 3
(2 rows)
</pre>
@anchor literature
@literature
[1] P. Flajolet and N.G. Martin. Probabilistic counting algorithms for data base applications, Journal of Computer and System Sciences 31(2), pp 182-209, 1985. http://algo.inria.fr/flajolet/Publications/FlMa85.pdf
@anchor related
@par Related Topics
File sketch.sql_in documenting the SQL function.
*/
/**
@addtogroup grp_countmin
<div class="toc"><b>Contents</b>
<ul>
<li><a href="#syntax">Syntax</a></li>
<li><a href="#examples">Examples</a></li>
<li><a href="#literature">Literature</a></li>
<li><a href="#related">Related Topics</a></li>
</ul>
</div>
@brief Implements Cormode-Mathukrishnan <i>CountMin</i> sketches on integer
values as a user-defined aggregate.
This module implements Cormode-Muthukrishnan <i>CountMin</i> sketches
on integer values, implemented as a user-defined aggregate. It also provides
scalar functions over the sketches to produce approximate counts, order
statistics, and histograms.
@anchor syntax
@par Syntax
- Get a sketch of a selected column specified by <em>col_name</em>.
<pre class="syntax">
cmsketch( col_name )
</pre>
- Get the number of rows where <em>col_name = p</em>, computed from the sketch
obtained from <tt>cmsketch</tt>.
<pre class="syntax">
cmsketch_count( cmsketch,
p )
</pre>
- Get the number of rows where <em>col_name</em> is between <em>m</em> and <em>n</em> inclusive.
<pre class="syntax">
cmsketch_rangecount( cmsketch,
m,
n )
</pre>
- Get the <em>k</em>th percentile of <em>col_name</em> where <em>count</em> specifies number of rows. <em>k</em> should be an integer between 1 to 99.
<pre class="syntax">
cmsketch_centile( cmsketch,
k,
count )
</pre>
- Get the median of col_name where <em>count</em> specifies number of rows. This is equivalent to <tt>\ref cmsketch_centile(<em>cmsketch</em>,50,<em>count</em>)</tt>.
<pre class="syntax">
cmsketch_median( cmsketch,
count )
</pre>
- Get an n-bucket histogram for values between min and max for the column where each bucket has approximately the same width. The output is a text string containing triples {lo, hi, count} representing the buckets; counts are approximate.
<pre class="syntax">
cmsketch_width_histogram( cmsketch,
min,
max,
n )
</pre>
- Get an n-bucket histogram for the column where each bucket has approximately the same count. The output is a text string containing triples {lo, hi, count} representing the buckets; counts are approximate. Note that an equi-depth histogram is equivalent to a spanning set of equi-spaced centiles.
<pre class="syntax">
cmsketch_depth_histogram( cmsketch,
n )
</pre>
@note This is a [User Defined Aggregate](https://www.postgresql.org/docs/current/static/xaggr.html)
which returns the results when used in a query. Use "CREATE TABLE AS ", with the
UDA as subquery if the results are to be stored. This is unlike the usual MADlib
stored procedure interface which places the results in a table instead of
returning it.
@anchor examples
@examp
-# Generate some data.
<pre class="example">
CREATE TABLE data(class INT, a1 INT);
INSERT INTO data SELECT 1,1 FROM generate_series(1,10000);
INSERT INTO data SELECT 1,2 FROM generate_series(1,15000);
INSERT INTO data SELECT 1,3 FROM generate_series(1,10000);
INSERT INTO data SELECT 2,5 FROM generate_series(1,1000);
INSERT INTO data SELECT 2,6 FROM generate_series(1,1000);
</pre>
-# Count number of rows where a1 = 2 in each class. Store results in a table.
<pre class="example">
CREATE TABLE sketch_count AS
SELECT class,
cmsketch_count( cmsketch( a1 ), 2 )
FROM data GROUP BY data.class;
SELECT * FROM sketch_count;
</pre>
Result:
<pre class="result">
class | cmsketch_count
&nbsp;------+----------------
2 | 0
1 | 15000
(2 rows)
</pre>
-# Count number of rows where a1 is between 3 and 6.
<pre class="example">
SELECT class,
cmsketch_rangecount( cmsketch(a1), 3, 6 )
FROM data GROUP BY data.class;
</pre>
Result:
<pre class="result">
class | cmsketch_rangecount
&nbsp;------+---------------------
2 | 2000
1 | 10000
(2 rows)
</pre>
-# Compute the 90th percentile of all of a1.
<pre class="example">
SELECT cmsketch_centile( cmsketch( a1 ), 90, count(*) )
FROM data;
</pre>
Result:
<pre class="result">
cmsketch_centile
&nbsp;-----------------
3
(1 row)
</pre>
-# Produce an equi-width histogram with 2 bins between 0 and 10.
<pre class="example">
SELECT cmsketch_width_histogram( cmsketch( a1 ), 0, 10, 2 )
FROM data;
</pre>
Result:
<pre class="result">
cmsketch_width_histogram
&nbsp;-----------------------------------
[[0L, 4L, 35000], [5L, 10L, 2000]]
(1 row)
</pre>
-# Produce an equi-depth histogram of a1 with 2 bins of approximately equal depth.
<pre class="example">
SELECT cmsketch_depth_histogram( cmsketch( a1 ), 2 )
FROM data;
</pre>
Result:
<pre class="result">
cmsketch_depth_histogram
&nbsp;----------------------------------------------------------------------
[[-9223372036854775807L, 1, 10000], [2, 9223372036854775807L, 27000]]
(1 row)
</pre>
@anchor literature
@literature
[1] G. Cormode and S. Muthukrishnan. An improved data stream summary: The count-min sketch and its applications. LATIN 2004, J. Algorithm 55(1): 58-75 (2005) . http://dimacs.rutgers.edu/~graham/pubs/html/CormodeMuthukrishnan04CMLatin.html
[2] G. Cormode. Encyclopedia entry on 'Count-Min Sketch'. In L. Liu and M. T. Ozsu, editors, Encyclopedia of Database Systems, pages 511-516. Springer, 2009. http://dimacs.rutgers.edu/~graham/pubs/html/Cormode09b.html
@anchor related
File sketch.sql_in documenting the SQL functions.
Module \ref grp_quantile for a different implementation of quantile function.
*/
/**
@addtogroup grp_mfvsketch
<div class="toc"><b>Contents</b>
<ul>
<li><a href="#syntax">Syntax</a></li>
<li><a href="#examples">Examples</a></li>
<li><a href="#literature">Literature</a></li>
<li><a href="#related">Related Topics</a></li>
</ul>
</div>
@brief Implements the most frequent values variant of the CountMin sketch as a user-defined aggregate.
MFVSketch: Most Frequent Values variant of CountMin sketch, implemented
as a UDA.
Produces an n-bucket histogram for a column where each bucket counts one of the
most frequent values in the column. The output is an array of doubles {value, count}
in descending order of frequency; counts are approximated via CountMin sketches.
Ties are handled arbitrarily.
@anchor syntax
The MFV frequent-value UDA comes in two different versions:
- a faithful implementation that preserves the approximation guarantees
of Cormode/Muthukrishnan,
<pre class="syntax">
mfvsketch_top_histogram( col_name,
n )
</pre>
- and a "quick and dirty" version that can do parallel aggregation in Greenplum
at the expense of missing some of the most frequent values.
<pre class="syntax">
mfvsketch_quick_histogram( col_name,
n )
</pre>
In PostgreSQL the two UDAs are identical. In Greenplum, the quick version should
produce good results unless the number of values requested is small,
or the distribution is flat.
@note This is a [User Defined Aggregate](https://www.postgresql.org/docs/current/static/xaggr.html)
which returns the results when used in a query. Use "CREATE TABLE AS ", with the
UDA as subquery if the results are to be stored. This is unlike the usual MADlib
stored procedure interface which places the results in a table instead of
returning it.
@anchor examples
@examp
-# Generate some data.
<pre class="example">
CREATE TABLE data(class INT, a1 INT);
INSERT INTO data SELECT 1,1 FROM generate_series(1,10000);
INSERT INTO data SELECT 1,2 FROM generate_series(1,15000);
INSERT INTO data SELECT 1,3 FROM generate_series(1,10000);
INSERT INTO data SELECT 2,5 FROM generate_series(1,1000);
INSERT INTO data SELECT 2,6 FROM generate_series(1,1000);
</pre>
-# Produce a histogram of 5 bins and return the most frequent value and associated
count in each bin.
<pre class="example">
SELECT mfvsketch_top_histogram( a1, 5 )
FROM data;
</pre>
Result:
<pre class="result">
mfvsketch_top_histogram
&nbsp;-------------------------------------------------------------
[0:4][0:1]={{2,15000},{1,10000},{3,10000},{5,1000},{6,1000}}
(1 row)
</pre>
@anchor literature
@literature
This method is not usually called an MFV sketch in the literature; it
is a natural extension of the CountMin sketch.
@anchor related
@par Related Topics
File sketch.sql_in documenting the SQL functions.
Module \ref grp_countmin.
*/
-- FM Sketch Functions
DROP FUNCTION IF EXISTS MADLIB_SCHEMA.big_or(bitmap1 bytea, bitmap2 bytea) CASCADE;
CREATE FUNCTION MADLIB_SCHEMA.big_or(bitmap1 bytea, bitmap2 bytea)
RETURNS bytea
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
DROP FUNCTION IF EXISTS MADLIB_SCHEMA.__fmsketch_trans(bitmaps bytea, input anyelement) CASCADE;
CREATE FUNCTION MADLIB_SCHEMA.__fmsketch_trans(bitmaps bytea, input anyelement)
RETURNS bytea
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
DROP FUNCTION IF EXISTS MADLIB_SCHEMA.__fmsketch_count_distinct(bitmaps bytea) CASCADE;
CREATE FUNCTION MADLIB_SCHEMA.__fmsketch_count_distinct(bitmaps bytea)
RETURNS int8
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
DROP FUNCTION IF EXISTS MADLIB_SCHEMA.__fmsketch_merge(bitmaps1 bytea, bitmaps2 bytea) CASCADE;
CREATE FUNCTION MADLIB_SCHEMA.__fmsketch_merge(bitmaps1 bytea, bitmaps2 bytea)
RETURNS bytea
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
DROP AGGREGATE IF EXISTS MADLIB_SCHEMA.fmsketch_dcount(anyelement);
/**
* @brief Flajolet-Martin's distinct count estimation
* @param column name
*/
CREATE AGGREGATE MADLIB_SCHEMA.fmsketch_dcount(/*+ column */ anyelement)
(
sfunc = MADLIB_SCHEMA.__fmsketch_trans,
stype = bytea,
finalfunc = MADLIB_SCHEMA.__fmsketch_count_distinct,
m4_ifdef(`__POSTGRESQL__', `', `prefunc = MADLIB_SCHEMA.__fmsketch_merge,')
initcond = ''
);
-- CM Sketch Functions
-- We register __cmsketch_int8_trans for varying numbers of arguments to support
-- a variety of agg function signatures. The first 2 args are used to
-- aggregate; the remaining args are carried along unchanged inside the
-- return structure for the use of the UDA finalizer.
DROP FUNCTION IF EXISTS MADLIB_SCHEMA.__cmsketch_int8_trans(bytea, int8) CASCADE;
CREATE FUNCTION MADLIB_SCHEMA.__cmsketch_int8_trans(bitmaps bytea, input int8)
RETURNS bytea
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
DROP FUNCTION IF EXISTS MADLIB_SCHEMA.__cmsketch_int8_trans(bytea, int8, int8) CASCADE;
CREATE FUNCTION MADLIB_SCHEMA.__cmsketch_int8_trans(bitmaps bytea, input int8, arg1 int8)
RETURNS bytea
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
DROP FUNCTION IF EXISTS MADLIB_SCHEMA.__cmsketch_int8_trans(bytea, int8, int8, int8) CASCADE;
CREATE FUNCTION MADLIB_SCHEMA.__cmsketch_int8_trans(bitmaps bytea, input int8, arg1 int8, arg2 int8)
RETURNS bytea
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
DROP FUNCTION IF EXISTS MADLIB_SCHEMA.__cmsketch_int8_trans(bytea, int8, int8, int8, int8) CASCADE;
CREATE FUNCTION MADLIB_SCHEMA.__cmsketch_int8_trans(bitmaps bytea, input int8, arg1 int8, arg2 int8, arg3 int8)
RETURNS bytea
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
DROP FUNCTION IF EXISTS MADLIB_SCHEMA.__cmsketch_base64_final(bytea) CASCADE;
CREATE FUNCTION MADLIB_SCHEMA.__cmsketch_base64_final(sketch bytea)
RETURNS text
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
DROP FUNCTION IF EXISTS MADLIB_SCHEMA.__cmsketch_merge(bytea, bytea) CASCADE;
CREATE FUNCTION MADLIB_SCHEMA.__cmsketch_merge(bytea, bytea)
RETURNS bytea
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
DROP AGGREGATE IF EXISTS MADLIB_SCHEMA.cmsketch(int8);
/**
*@brief <c>cmsketch</c> is a UDA that can be run on columns of type int8,
* or any column that can be cast to an int8. It produces a base64 string
* representing a CountMin sketch: a large array of counters that is intended
* to be passed into a UDF like <c>cmsketch_width_histogram</c> described below.
*/
CREATE AGGREGATE MADLIB_SCHEMA.cmsketch(/*+ column */ INT8)
(
sfunc = MADLIB_SCHEMA.__cmsketch_int8_trans,
stype = bytea,
finalfunc = MADLIB_SCHEMA.__cmsketch_base64_final,
m4_ifdef(`__POSTGRESQL__', `', `prefunc = MADLIB_SCHEMA.__cmsketch_merge,')
initcond = ''
);
/**
@brief <c>cmsketch_count</c> is a scalar UDF to compute the approximate
number of occurences of a value in a column summarized by a cmsketch. Takes
the results of the <c>cmsketch</c> aggregate as its first argument, and the
desired value as the second.
*/
DROP FUNCTION IF EXISTS MADLIB_SCHEMA.cmsketch_count(text, int8) CASCADE;
CREATE FUNCTION MADLIB_SCHEMA.cmsketch_count(sketches64 text, val int8)
RETURNS int8
AS $$
PythonFunctionBodyOnlyNoSchema(`sketch', `countmin')
return countmin.count(sketches64, val)
$$ LANGUAGE plpythonu
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
/**
@brief <c>cmsketch_rangecount</c> is a scalar UDF to approximate the number
of occurrences of values in the range <c>[lo,hi]</c> inclusive, given a
cmsketch of a column. Takes the results
of the <c>cmsketch</c> aggregate as its first argument, and the desired range
boundaries as the second and third.
*/
DROP FUNCTION IF EXISTS MADLIB_SCHEMA.cmsketch_rangecount(text, int8, int8) CASCADE;
CREATE FUNCTION MADLIB_SCHEMA.cmsketch_rangecount(sketches64 text, bot int8, top int8)
RETURNS int8
AS $$
PythonFunctionBodyOnlyNoSchema(`sketch', `countmin')
return countmin.rangecount(sketches64, bot, top)
$$ LANGUAGE plpythonu
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
/**
@brief <c>cmsketch_centile</c> is a scalar UDF to compute a centile value
from a cmsketch. Takes the results of the <c>cmsketch</c> aggregate as its
first argument, a number between 1 and 99 as the desired centile in the
second, and the count of the column as the third. Produces a value from the
sketched column that is approximately at the centile's position in sorted
order.
*/
DROP FUNCTION IF EXISTS MADLIB_SCHEMA.cmsketch_centile(text, int8, int8) CASCADE;
CREATE FUNCTION MADLIB_SCHEMA.cmsketch_centile(sketches64 text, centile int8, cnt int8)
RETURNS int8
AS $$
PythonFunctionBodyOnlyNoSchema(`sketch', `countmin')
return countmin.centile(sketches64, centile, cnt)
$$ LANGUAGE plpythonu
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
/**
@brief <c>cmsketch_median</c> is a scalar UDF to compute a median value
from a cmsketch. Takes the results of the <c>cmsketch</c> aggregate as its
first argument, and the count as the second. Produces a value from the
sketched column that is approximately at the halfway position in sorted
order.
*/
DROP FUNCTION IF EXISTS MADLIB_SCHEMA.cmsketch_median(text, int8) CASCADE;
CREATE FUNCTION MADLIB_SCHEMA.cmsketch_median(sketches64 text, cnt int8)
RETURNS int8
AS $$
PythonFunctionBodyOnlyNoSchema(`sketch', `countmin')
return countmin.centile(sketches64, 50, cnt)
$$ LANGUAGE plpythonu
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
/**
\brief <c>cmsketch_width_histogram</c> is a scalar UDF that takes three aggregates of a column -- cmsketch, min and max-- as well as a number of buckets, and produces an n-bucket histogram for the column where each bucket has approximately the same width. The output is a text string containing triples {lo, hi, count} representing the buckets; counts are approximate.
*/
DROP FUNCTION IF EXISTS MADLIB_SCHEMA.cmsketch_width_histogram(text, /*+ min */int8, /*+ max */int8, /*+ nbuckets */ int4) CASCADE;
CREATE FUNCTION MADLIB_SCHEMA.cmsketch_width_histogram(sketches64 text, themin int8, themax int8, nbuckets int4)
RETURNS text
AS $$
PythonFunctionBodyOnlyNoSchema(`sketch', `countmin')
# schema_madlib comes from PythonFunctionBodyOnly
return countmin.width_histogram( sketches64, themin, themax, nbuckets)
$$ LANGUAGE plpythonu
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
/** @brief <c>cmsketch_depth_histogram</c> is a UDA that takes a cmsketch and a number of buckets n, and produces an n-bucket histogram for the column where each bucket has approximately the same count. The output is a text string containing triples {lo, hi, count} representing the buckets; counts are approximate. Note that an equi-depth histogram is equivalent to a spanning set of equi-spaced centiles.
*/
DROP FUNCTION IF EXISTS MADLIB_SCHEMA.cmsketch_depth_histogram(text, /*+ nbuckets */ int4) CASCADE;
CREATE FUNCTION MADLIB_SCHEMA.cmsketch_depth_histogram(sketches64 text, nbuckets int4)
RETURNS text
AS $$
PythonFunctionBodyOnlyNoSchema(`sketch', `countmin')
return countmin.depth_histogram(sketches64, nbuckets)
$$ LANGUAGE plpythonu
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
-- MFV Sketch functions
DROP FUNCTION IF EXISTS MADLIB_SCHEMA.__mfvsketch_trans(bytea, anyelement, int4) CASCADE;
CREATE FUNCTION MADLIB_SCHEMA.__mfvsketch_trans(bytea, anyelement, int4)
RETURNS bytea
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
DROP FUNCTION IF EXISTS MADLIB_SCHEMA.__mfvsketch_final(bytea) CASCADE;
CREATE FUNCTION MADLIB_SCHEMA.__mfvsketch_final(bytea)
RETURNS text[][]
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
DROP FUNCTION IF EXISTS MADLIB_SCHEMA.__mfvsketch_merge(bytea, bytea) CASCADE;
CREATE FUNCTION MADLIB_SCHEMA.__mfvsketch_merge(bytea, bytea)
RETURNS bytea
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.__sketch_rightmost_one(bytea, integer, integer)
RETURNS integer AS 'MODULE_PATHNAME', 'sketch_rightmost_one' LANGUAGE C STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.__sketch_leftmost_zero(bytea, integer, integer)
RETURNS integer AS 'MODULE_PATHNAME', 'sketch_leftmost_zero' LANGUAGE C STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.__sketch_array_set_bit_in_place(bytea, integer, integer, integer, integer)
RETURNS bytea AS 'MODULE_PATHNAME', 'sketch_array_set_bit_in_place' LANGUAGE C STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');
DROP AGGREGATE IF EXISTS MADLIB_SCHEMA.mfvsketch_top_histogram( anyelement, int4);
/**
* @brief Produces an n-bucket histogram for a column where each bucket counts
* one of the most frequent values in the column. The output is an array of
* doubles {value, count} in descending order of frequency; counts are
* approximated via CountMin sketches. Ties are handled arbitrarily.
*/
CREATE AGGREGATE MADLIB_SCHEMA.mfvsketch_top_histogram(/*+ column */ anyelement, /*+ number_of_buckets */ int4)
(
sfunc = MADLIB_SCHEMA.__mfvsketch_trans,
stype = bytea,
finalfunc = MADLIB_SCHEMA.__mfvsketch_final,
initcond = ''
);
DROP AGGREGATE IF EXISTS MADLIB_SCHEMA.mfvsketch_quick_histogram(anyelement, int4);
/**
* @brief On Postgres it works the same way as \ref mfvsketch_top_histogram but,
* in Greenplum it does parallel aggregation to provide a "quick and dirty" answer.
*/
CREATE AGGREGATE MADLIB_SCHEMA.mfvsketch_quick_histogram(/*+ column */ anyelement, /*+ number_of_buckets */ int4)
(
sfunc = MADLIB_SCHEMA.__mfvsketch_trans,
stype = bytea,
finalfunc = MADLIB_SCHEMA.__mfvsketch_final,
m4_ifdef(`__POSTGRESQL__', `', `prefunc = MADLIB_SCHEMA.__mfvsketch_merge,')
initcond = ''
);