Nano Hash - криптовалюты, майнинг, программирование

Как получить 5 лучших записей в cassandra 2.2

Мне нужна помощь. У меня есть запрос, который получает 5 лучших групп записей по дате (не по дате + времени) и по сумме.

Я написал следующее, но он возвращает все записи, а не только 5 лучших записей.

CREATE OR REPLACE FUNCTION state_groupbyandsum( state map<text, double>, datetime text, amount text )
CALLED ON NULL INPUT
RETURNS map<text, double>
LANGUAGE java 
AS 'String date = datetime.substring(0,10); Double count = (Double) state.get(date);  if (count == null) count = Double.parseDouble(amount); else count = count +  Double.parseDouble(amount); state.put(date, count); return state;' ;


CREATE OR REPLACE AGGREGATE groupbyandsum(text, text) 
SFUNC state_groupbyandsum
STYPE map<text, double>
INITCOND {};

select groupbyandsum(datetime, amout) from warehouse;

Не могли бы вы помочь, чтобы получить только 5 записей.


Ответы:


1

Вот один из способов сделать это. Ваша группа по функции состояния может быть такой:

CREATE FUNCTION state_group_and_total( state map<text, double>, type text, amount double )
CALLED ON NULL INPUT
RETURNS map<text, double>
LANGUAGE java AS '
     Double count = (Double) state.get(type);
     if (count == null)
         count = amount;
     else
         count = count + amount;
     state.put(type, count);
     return state;
';

Это создаст карту всех строк сумм, выбранных вашим запросом WHERE. Теперь сложная часть заключается в том, как сохранить только верхние N. Один из способов сделать это — использовать FINALFUNC, который выполняется после того, как все строки будут помещены в карту. Итак, вот функция, которая использует цикл, чтобы найти максимальное значение на карте и переместить его на карту результатов. Таким образом, чтобы найти верхнее N, он будет перебирать карту N раз (есть более эффективные алгоритмы, чем этот, но это просто быстрый и грязный пример).

Итак, вот пример, чтобы найти два верхних:

CREATE FUNCTION topFinal (state map<text, double>)
CALLED ON NULL INPUT
RETURNS map<text, double>
LANGUAGE java AS '
    java.util.Map<String, Double> inMap = new java.util.HashMap<String, Double>(),
                                  outMap = new java.util.HashMap<String, Double>();

    inMap.putAll(state);

    int topN = 2;
    for (int i = 1; i <= topN; i++) {
        double maxVal = -1;
        String moveKey = null;
        for (java.util.Map.Entry<String, Double> entry : inMap.entrySet()) {

            if (entry.getValue() > maxVal) {
                maxVal = entry.getValue();
                moveKey = entry.getKey();
            }
        }
        if (moveKey != null) {
            outMap.put(moveKey, maxVal);
            inMap.remove(moveKey);
        }
    }

    return outMap;
';

Затем, наконец, вам нужно определить AGGREGATE для вызова двух определенных вами функций:

CREATE OR REPLACE AGGREGATE group_and_total(text, double) 
     SFUNC state_group_and_total 
     STYPE map<text, double> 
     FINALFUNC topFinal
     INITCOND {};

Итак, давайте посмотрим, работает ли это.

CREATE table test (partition int, clustering text, amount double, PRIMARY KEY (partition, clustering));
INSERT INTO test (partition , clustering, amount) VALUES ( 1, '2015', 99.1);
INSERT INTO test (partition , clustering, amount) VALUES ( 1, '2016', 18.12);
INSERT INTO test (partition , clustering, amount) VALUES ( 1, '2017', 44.889);
SELECT * from test;

 partition | clustering | amount
-----------+------------+--------
         1 |       2015 |   99.1
         1 |       2016 |  18.12
         1 |       2017 | 44.889

Теперь барабанная дробь...

SELECT group_and_total(clustering, amount) from test where partition=1;

 agg.group_and_total(clustering, amount)
-------------------------------------------
            {'2015': 99.1, '2017': 44.889}

Итак, вы видите, что он сохранил две верхние строки в зависимости от суммы.

Обратите внимание, что ключи не будут отсортированы, так как это карта, и я не думаю, что мы можем контролировать порядок ключей на карте, поэтому сортировка в FINALFUNC будет пустой тратой ресурсов. Если вам нужна сортировка карты, вы можете сделать это в клиенте.

Я думаю, вы могли бы сделать больше работы в функции state_group_and_total, чтобы удалять элементы с карты по мере продвижения. Это может быть лучше, чтобы карта не стала слишком большой.

05.08.2015
  • Отличный ответ! Я собираюсь дать этому шанс. 05.08.2015
  • я пробовал это, но он показывает ошибку cqlsh:chris> выберите group_and_total (отметка времени, значение) из хранилища; InvalidRequest: code=2200 [Invalid query] message=Ошибка типа: значение не может быть передано в качестве аргумента 1 функции chris.group_and_total типа double 07.08.2015
  • Может вы что-то не так скопировали. Первый аргумент функции group_and_total в моем примере имеет тип text, а не double. Сделайте описание ФУНКЦИИ и опишите АГРЕГАТ по функциям и убедитесь, что они верны. 07.08.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..