使用 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 上执行此操作可能具有更大的价值。