使用 UDF 和 UDA 在 Cassandra 中实现草图
Implementing sketches in Cassandra using UDF and UDA
我正在尝试在 Cassandra 中实现一个 UDF,我在其中传递一个包含实际查询行数的参数。 UDF 看起来像:
CREATE OR REPLACE FUNCTION hashvalue(value text, size int)
RETURNS NULL ON NULL INPUT
RETURNS int
LANGUAGE java
AS
$$
return Math.abs(value.hashCode() % size);
$$;
查询应该如下所示:
SELECT name, hashvalues(name, (SELECT count(*) FROM test_table) AS hash) FROM test_table;
我期待这样的事情:
name hash
text1 184
text2 932
text3 3
[...]
我收到这个错误:
SyntaxException:第 1:25 行在输入 'SELECT' 处没有可行的替代方案(SELECT 哈希值(名称,[(]SELECT...)
我的总体想法是将其全部映射到一个地图中,最后我想通过 UDA 将其转换为草图(例如 Bloomfilter)。
这在某种程度上是可能的还是我的想法完全错误?谢谢
编辑:
将所有草图信息存储在一个 UDT 中是一种更好的方法。据我所知...
CREATE TYPE bloomfilter_udt(
n_as_sample_size int,
m_as_number_of_buckets int,
p_as_next_prime_above_m bigint,
hash_for_string_coefficient_a list <bigint>,
hash_for_number_coefficients_a list <bigint>,
hash_for_number_coefficients_b list <bigint>,
bloom_filter_as_map map<int, int>
);
CREATE OR REPLACE FUNCTION bloomfilter_udf(state bloomfilter_udt, value text, sample_size int)
CALLED ON NULL INPUT
RETURNS bloomfilter_udt
LANGUAGE java
AS
$$
//do something
return state;
$$;
CREATE OR REPLACE AGGREGATE bloomfilter_uda(text, int)
SFUNC bloomfilter_udf
STYPE bloomfilter_udt
INITCOND {};
CQL 不允许子查询。
您可能需要重新考虑此处的方法。将工程时间花在应用程序端而不是在 Cassandra 上执行此操作可能具有更大的价值。
我正在尝试在 Cassandra 中实现一个 UDF,我在其中传递一个包含实际查询行数的参数。 UDF 看起来像:
CREATE OR REPLACE FUNCTION hashvalue(value text, size int)
RETURNS NULL ON NULL INPUT
RETURNS int
LANGUAGE java
AS
$$
return Math.abs(value.hashCode() % size);
$$;
查询应该如下所示:
SELECT name, hashvalues(name, (SELECT count(*) FROM test_table) AS hash) FROM test_table;
我期待这样的事情:
name hash
text1 184
text2 932
text3 3
[...]
我收到这个错误:
SyntaxException:第 1:25 行在输入 'SELECT' 处没有可行的替代方案(SELECT 哈希值(名称,[(]SELECT...)
我的总体想法是将其全部映射到一个地图中,最后我想通过 UDA 将其转换为草图(例如 Bloomfilter)。
这在某种程度上是可能的还是我的想法完全错误?谢谢
编辑:
将所有草图信息存储在一个 UDT 中是一种更好的方法。据我所知...
CREATE TYPE bloomfilter_udt(
n_as_sample_size int,
m_as_number_of_buckets int,
p_as_next_prime_above_m bigint,
hash_for_string_coefficient_a list <bigint>,
hash_for_number_coefficients_a list <bigint>,
hash_for_number_coefficients_b list <bigint>,
bloom_filter_as_map map<int, int>
);
CREATE OR REPLACE FUNCTION bloomfilter_udf(state bloomfilter_udt, value text, sample_size int)
CALLED ON NULL INPUT
RETURNS bloomfilter_udt
LANGUAGE java
AS
$$
//do something
return state;
$$;
CREATE OR REPLACE AGGREGATE bloomfilter_uda(text, int)
SFUNC bloomfilter_udf
STYPE bloomfilter_udt
INITCOND {};
CQL 不允许子查询。
您可能需要重新考虑此处的方法。将工程时间花在应用程序端而不是在 Cassandra 上执行此操作可能具有更大的价值。