Как сопоставить java.time.Duration столбец Cassandra DB с типом time

Цель:

Сопоставьте java.time.Duration от JDK8 + до столбца Cassandra DB с типом time.

Ситуация:

Я не смог найти ни стандартного сопоставления, ни какого-либо кодека (даже в зависимости от maven с дополнительными кодеками), который мог бы это сделать. Это проект maven java 8 с драйвером datastax для Cassandra DB.

Вопрос:

Кто-нибудь знает жизнеспособное решение для этого или любого кодека? Если нет, то это лучший способ решить проблему через java.sql.time или это вообще возможно?

Если я забыл некоторые важные детали, прокомментируйте, пожалуйста, ниже.

Предложите переформулировать свой вопрос, чтобы он не относился к запросу библиотеки / инструмента. Просто спросите: как мне сопоставить java.time.Duration со столбцом Cassandra DB с типом time? Подробнее в центр помощи. См. Также Как мне задать хороший вопрос?, Каких типов вопросов мне следует избегать? и Какие темы я могу задать здесь?(Не мой голос против).

T.J. Crowder 04.06.2018 16:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
459
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

tl; dr

Используйте Cassandra типа duration, а не time.

Передайте или проанализируйте стандартные строки ISO 8601 с помощью класса java.time.Duration.

Duration.parse( "PT1H30M" )  // Parse ISO 8601 string into a `Duration` object.
        .toString()          // Generate a ISO 8601 string from the `Duration` object.

Duration не время

Класс java.time.Duration представляет промежуток времени, не привязанный к временной шкале. нет представляет время суток.

Тип Cassandra time определяется как:

Value is encoded as a 64-bit signed integer representing the number of nanoseconds since midnight. Values can be represented as strings, such as 13:30:54.234.

Таким образом, вам не следует сохранять значение Duration, используя тип Cassandra time.

У вас есть другие варианты.

Один из вариантов - сохранить стандартный Текстовое представление продолжительности ISO 8601: PnYnMnDTnHnMnS. Пример: полтора часа - это PT1H30M. Этот вариант более правдивый, но значения нельзя сравнивать или отсортировать в Cassandra, так как они будут просто текстом без хронологического алфавитного порядка. Также см. Раздел «Продолжительность Кассандры» ниже в этом ответе.

Другой вариант - извлечь два числа, используемых внутри Duration:

  • 64-битное целое число, количество секунд.
  • 32-битное целое число, количество наносекунд в долях секунды.

Если вы настаиваете, вы можете использовать эти числа для генерации значения, которое будет сохранено как Cassandra time, но вы нарушите семантику.

long fakeNanosSinceMidnight = TimeUnit.SECONDS.toNanos( duration.getSeconds ) + duration.getNano() ;  // NOT recommended, but if you insist on abusing Cassandra semantics, here you go. 

Кассандра Duration

Cassandra документация говорит типа duration встроен. Я не использую Cassandra, поэтому не могу за нее поручиться.

В документе указано, что он принимает в качестве входных данных стандартную строку продолжительности ISO 8601. Метод Duration::toString в Java генерирует такие строки, а Duration::parse анализирует их.

String inputDurationForCassandra = duration.toString() ;

И парсинг.

Duration duration = Duration.parse( myCassandraDurationString ) ;

Имейте в виду, что Java использует класс Duration для дней (общие 24-часовые фрагменты, а не календарные дни), часов, минут и секунд. Класс Period представляет годы, месяцы, дни. Обычно нет смысла объединять эти две концепции. Но если вы настаиваете, вы можете использовать класс PeriodDuration из библиотеки проекта ThreeTen-Extra.

Абсолютно верно, я только что осознал разницу ... В документации apache cassandra указано, что уже должен быть тип продолжительности: cassandra.apache.org/doc/latest/cql/types.html Но я не мог создать поле с этим типом, и я не мог найти никакой информации о версии Apache Cassandra на эта страница, на которой основана статья, чтобы я мог проверить, не устарела ли моя версия.

mweber 04.06.2018 17:37

Другие вопросы по теме