Да, вам понадобится что-то подобное в PlayOrm ... (опубликуйте комментарий, если мне что-то не хватает, и я могу ответить снова).
https://github.com/deanhiller/playorm/blob/master/src/test/java/com/alvazan/test/db/PartitionedTrade.java
а также запрос ПЕРЕГОРОДКИ т ('счет',: PartID) Выбрать T FROM TABLE, как т INNER JOIN t.security при s- WHERE s.securityType =: тип и t.numShares =: акции "
« учетная запись »идентифицирует столбец раздела и: partId является идентификатором раздела. В вашем случае у вас есть PARTITIONS t ('deviceid', {actualDeviceId}) или t ('time', {time }), где первый параметр - это имя столбца, а второй - фактический идентификатор раздела для времени или идентификатор раздела для устройства. Реализация разделов не должна превышать X миллионов строк, где X, вероятно, составляет около 3 милли на.
В пакете com.alvazan.test.db есть множество различных примеров, и com.alvazan.test показывает, как они используются. Я собираюсь попросить кого-то настроить документы на основе вашей обратной связи, чтобы поместить ссылки непосредственно на код в нашей кодовой базе ...
ps. если вы загружаете из github, запустите eclipse gradlew или eclipse gradle (в зависимости от ОС), а затем импортируйте в eclipse, все тесты работают из коробки с версией noSQL в памяти (мы используем ее для разработки). Затем, если вы хотите работать против cassandra, в документах есть способ изменить одну строку, и все тесты выполняются против cassandra.
Ускорение. PlayOrm выполняет широкий ряд, используя шаблон составного имени для каждого раздела (индекс для каждого раздела). Когда вы запрашиваете, он читает эту строку партиями из 200 (или размерами, которые вы предоставляете), а затем отправляет запросы с использованием ключей, найденных в индексе, ко всем машинам (т. Е. На данный момент вы получаете параллельную пропускную способность). Это связано с тем, что каждый раздел распространяется по кластеру. На самом деле, все узлы в конечном итоге имеют срезы почти всех разделов, в зависимости от того, сколько у вас узлов и сколько разделов (то есть 100 узлов и 32 раздела, а не все узлы будут иметь все разделы).
Под одеялом играющий делает что-то действительно очень простое. Все строки написаны так, как будто они не были разделены вообще !!! Затем записывается строка индекса (RF = 3 означает 3 узла), а имя строки индекса -/TABLE/partition/column/partitionId. Это ключ строки для индекса. С помощью инструмента командной строки вы даже можете прочитать индекс самостоятельно, а только индекс или запросить раздел. Для этого используйте инструмент командной строки playOrm.
Наконец, поскольку широкие строки в Кассандре упорядочены, когда вы используете определенный индекс, как ПЕРЕГОРОДКИ й («DeviceId», «device1») выберите г из таблицы, как г где d.time> Integer.MIN_INT
, тогда результаты возвращаются в порядке этого индекса (т. Е. Время в этом случае), или если вы хотите обратный порядок, просто вызовите курсор.afterLast затем курсор.прерывный, курсор.прерывный и т. Д. И т. Д.
clear, PlayOrm игнорирует разметку cassandra. Он записывается в ваши данные так же, как и вообще никакого раздела. Он также пишет в индексе или два. Предположим, вы разбиваете дважды, один раз по времени и один раз по идентификатору устройства. В этом случае он записывает в таблицу StringIndice или IntegerIndice (BigInteger !!! not Integer) с клавишами строк (и говорит, что ваш объект называется Устройством). Давайте также скажем в вашей сущности, вы @NoSqlIndexed в столбце «name» !!!!
/Devices/byDevice/device1/name = the wide row
/Devices/byTime/time56/name = the wide row
Если у вас есть более @NoSqlIndexed столбцов, есть несколько строк в таблицах индексов. Однако все строки распределены по кластеру и не заботятся о разделении.
Имеет ли это смысл? Не стесняйтесь дать ему шанс и попробовать. Просто опубликуйте новый вопрос о stackoverflow, если у вас есть какие-либо вопросы/вопросы по его внедрению.
Дин, я хотел бы знать, как бы PlayORM убедиться, что оба запроса выполняются быстро? Предположим, что у вас есть Устройства 500 K, и для каждого устройства у нас есть 10 K timeStamps. Можете ли вы запустить меня, как сделать разбиение на разделы в cassandra для схемы выше, и как должно происходить виртуальное разбиение. Допустим, у меня есть кластер cassandra с тремя узлами, тогда вы можете дать мне коэффициент ускорения из-за PlayORM по сравнению с оригинальной производительностью? И можете ли вы, пожалуйста, сообщить мне, почему эта скорость происходит? – Ouroboros
Дин, для каждого «TimeStamp» есть записи 500 K. Когда раздел был сделан с Cassandra в timestamp, разве это не похоже на PARTITIONS в PlayORM t ('timestamp', {time})? Проблема, которая у меня есть, заключается в том, что в Cassandra все записи раздела (в этом случае записываются как временная метка) попадают внутрь узла. Это приводит к замедлению, поскольку ответ ограничен узким диском. Лучше ли решение PARORMTION от PlayORM? Я считаю, что если все записи для раздела в метке времени распределены по всем узлам кластера, это решение будет наиболее эффективным. – Ouroboros
Также вы можете объяснить, как cassandra хранит все данные только один раз (без репликации), но PlayORM может создавать несколько разделов на разных столбцах CF? Это звучит слишком хорошо, чтобы быть правдой. Можете ли вы дать представление о том, как разные разделы хранятся в Кассандре, и если все записи раздела хранятся в одном узле? Мне трудно убедить себя, что на CF может появиться более одного раздела, когда раздел имеет все записи на определенном узле кластера.Любая ссылка на архитектуру виртуального разбиения PlayORM была бы полезна. – Ouroboros