我检查过很多来源但是cudnt得到了结果。
如何在vertica中创建一个函数来返回所有会话的计数 数据库?
有人可以在这个主题中提供一些想法或可能的例子。
答案 0 :(得分:0)
您可以在Vertica中创建UDX,但它没有会话句柄,因此您只能访问通过API公开的数据。会话数据未公开。
您需要执行查询才能执行此操作。
SELECT COUNT(*) FROM sessions;
答案 1 :(得分:0)
请参阅此帖子了解类似内容:
max(avg(score))
FROM v_monitor.sessions ORDER BY current_statement_duration DESC ;
此外,您可以从这篇文章获得更多信息: 的 Script to List Vertica Active Sessions 强>
答案 2 :(得分:0)
创建C ++(count_it.cpp)
#include "Vertica.h"
#include <time.h>
#include <sstream>
#include <iostream>
using namespace Vertica;
using namespace std;
class Average : public AggregateFunction
{
virtual void initAggregate(ServerInterface &srvInterface, IntermediateAggs &aggs)
{
try {
VNumeric &sum = aggs.getNumericRef(0);
sum.setZero();
vint &cnt = aggs.getIntRef(1);
cnt = 0;
} catch(exception& e) {
vt_report_error(0, "Exception while initializing intermediate aggregates: [%s]", e.what());
}
}
void aggregate(ServerInterface &srvInterface, BlockReader &argReader, IntermediateAggs &aggs)
{
try {
VNumeric &sum = aggs.getNumericRef(0);
vint &cnt = aggs.getIntRef(1);
do {
const VNumeric &input = argReader.getNumericRef(0);
if (!input.isNull()) {
sum.accumulate(&input);
sum.setZero();
cnt++;
}
} while (argReader.next());
} catch(exception& e) {
vt_report_error(0, "Exception while processing aggregate: [%s]", e.what());
}
}
virtual void combine(ServerInterface &srvInterface,IntermediateAggs &aggs,MultipleIntermediateAggs &aggsOther)
{
try {
VNumeric &mySum = aggs.getNumericRef(0);
vint &myCount = aggs.getIntRef(1);
do {
const VNumeric &otherSum = aggsOther.getNumericRef(0);
const vint &otherCount = aggsOther.getIntRef(1);
mySum.accumulate(&otherSum);
mySum.setZero();
myCount += otherCount;
} while (aggsOther.next());
} catch(exception& e) {
vt_report_error(0, "Exception while combining intermediate aggregates: [%s]", e.what());
}
}
virtual void terminate(ServerInterface &srvInterface, BlockWriter &resWriter, IntermediateAggs &aggs)
{
try {
const VerticaType &numtype = aggs.getTypeMetaData().getColumnType(0);
const VNumeric &sum = aggs.getNumericRef(0);
sum.setZero();
uint64* tmp = (uint64*)malloc(numtype.getMaxSize() / sizeof(uint64));
VNumeric cnt(tmp, numtype.getNumericPrecision(), numtype.getNumericScale());
cnt.copy(aggs.getIntRef(1));
VNumeric &out = resWriter.getNumericRef();
if (cnt.isZero())
out.setZero();
else
out.add(&cnt,&sum);
} catch(exception& e) {
vt_report_error(0, "Exception while computing aggregate output: [%s]", e.what());
}
}
InlineAggregate()
};
class count_itFactory : public AggregateFunctionFactory
{
virtual void getPrototype(ServerInterface &srvfloaterface,ColumnTypes &argTypes,ColumnTypes &returnType)
{
argTypes.addNumeric();
returnType.addNumeric();
}
virtual void getReturnType(ServerInterface &srvfloaterface,const SizedColumnTypes &inputTypes,SizedColumnTypes &outputTypes)
{
int int_part = inputTypes.getColumnType(0).getNumericPrecision();
int frac_part = inputTypes.getColumnType(0).getNumericScale();
outputTypes.addNumeric(int_part+frac_part, frac_part);
}
virtual void getIntermediateTypes(ServerInterface &srvInterface,const SizedColumnTypes &inputTypes,SizedColumnTypes &intermediateTypeMetaData)
{
int int_part = inputTypes.getColumnType(0).getNumericIntegral();
int frac_part = inputTypes.getColumnType(0).getNumericFractional();
intermediateTypeMetaData.addNumeric(int_part+frac_part, frac_part);
intermediateTypeMetaData.addInt();
}
virtual AggregateFunction *createAggregateFunction(ServerInterface &srvfloaterface)
{ return vt_createFuncObject<Average>(srvfloaterface.allocator); }
};
RegisterFactory(count_itFactory);
编译C ++
g++ -D HAVE_LONG_INT_64 -I /opt/vertica/sdk/include -Wall -shared -Wno-unused-value -fPIC -o count_it.so /home/dbadmin/libs/count_it.cpp /opt/vertica/sdk/include/Vertica.cpp
创建库
CREATE LIBRARY count_it AS '/home/dbadmin/libs/count_it.so';
创建功能
CREATE AGGREGATE FUNCTION count_it AS LANGUAGE 'C++' NAME 'count_itFactory' LIBRARY count_it;
使用功能
select count_it(client_id) from sesions;