Я новичок в Cassandra и пытаюсь обновить таблицу с помощью этого CQL-запроса:
UPDATE analytics SET counter = ? WHERE hash = ?;
Я работаю в PHP, используя php-драйвер DataStax, код для этого утверждения:
$statement = $session->prepare("UPDATE analytics SET counter = ? WHERE hash = ?;");
$session->execute($statement, new Cassandra\ExecutionOptions(array('arguments' => array($count, $hash))));
Стол:
CREATE TABLE IF NOT EXISTS analytics (domain VARCHAR, page VARCHAR, ip INET, attributes MAP <VARCHAR, VARCHAR>, hash VARCHAR, counter INT, date TIMESTAMP, PRIMARY KEY(hash, domain, date));
Когда я выполняю заявление, я получаю ошибкуОтсутствует обязательный первичный ключ часть домена«поэтому я добавил предложение РАЗРЕШИТЬ ФИЛЬТРИРОВАНИЕ:
UPDATE analytics SET counter = ? WHERE hash = ? ALLOW FILTERING;
Но я получаю еще одну ошибку «в строке 1:48 отсутствует EOF в разрешении».
Что не так в этих запросах?
Исходя из вашей ошибки, я думаю, вы создали таблицу с составным первичным ключом (хэш, домен). Чтобы обновить запись в cassandra, вы должны предоставить весь ключ, то есть оба значения, поэтому ваш запрос должен выглядеть следующим образом:
ОБНОВЛЕНИЕ аналитики SET counter = counter + 1 ГДЕ хэш =? а домен =?
Для получения дополнительной информации проверьте это http://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause
Это говорит: В операторах UPDATE и DELETE все столбцы первичного ключа должны быть ограничены …
Вы должны передать все первичные ключи, когда вы хотите обновить столбец. Поэтому поместите все первичные ключи в пункт where.
Вы действительно хотите обновить все значения счетчика для хэша независимо от даты?
Во всяком случае, будьте осторожны с индексами. При использовании индекса обязательно указывайте ключ раздела, чтобы ваш запрос совпадал только с одним разделом. В противном случае у вас будет операция на уровне кластера, которая, скорее всего, прекратит работу.
Если ваша модель данных не поддерживает запрос, но вам нужно что-то аналитическое, хорошим вариантом будет использование Apache Spark и его использование для заданий пакетного типа.