Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cassandra "no viable alternative at input"

I am trying to insert a simple row into the table. Can someone point out what is happening here ?

CREATE TABLE recommendation_engine_poc.user_by_category (         game_category text,         customer_id text,         amount double,         game_date timestamp,         PRIMARY KEY (game_category, customer_id)     ) WITH CLUSTERING ORDER BY (customer_id ASC)         AND bloom_filter_fp_chance = 0.01         AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'         AND comment = ''         AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}         AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}         AND dclocal_read_repair_chance = 0.1         AND default_time_to_live = 0         AND gc_grace_seconds = 864000         AND max_index_interval = 2048         AND memtable_flush_period_in_ms = 0         AND min_index_interval = 128         AND read_repair_chance = 0.0         AND speculative_retry = '99.0PERCENTILE';      cqlsh:recommendation_engine_poc> insert into user_by_category  ('game_category','customer_id') VALUES ('Goku','12') ;     SyntaxException: <ErrorMessage code=2000 [Syntax error in CQL query] message="line 1:31 no viable alternative at input 'game_category' (insert into user_by_category  (['game_categor]...)"> 
like image 228
Adelin Avatar asked Aug 20 '15 11:08

Adelin


People also ask

What is Cqlsh?

cqlsh is a command-line interface for interacting with Cassandra using CQL (the Cassandra Query Language). It is shipped with every Cassandra package, and can be found in the bin/ directory alongside the cassandra executable.

What is allow filtering in Cassandra?

Cassandra will request ALLOW FILTERING as it will have to first find and load the rows containing Jonathan as author, and then to filter out the ones which do not have a time2 column equal to the specified value. Adding an index on time2 might improve the query performance.

How do you add a timestamp in Cassandra?

Inserting the current timestamp Current date and time into timestamp field: toTimestamp(now()) sets the timestamp to the current time of the coordinator. Current date (midnight) into timestamp field: toTimestamp(toDate(now())) sets the timestamp to the current date beginning of day (midnight).


2 Answers

Wrong syntax. Here you are:

insert into user_by_category (game_category,customer_id) VALUES ('Goku','12');

or:

insert into user_by_category ("game_category","customer_id") VALUES ('Kakarot','12');

The second one is normally used for case-sensitive column names.

like image 137
piotrwest Avatar answered Sep 20 '22 15:09

piotrwest


When using placeholders (either for preparing a statement, or just to use a dict for populating values), there is another problem that can occur: whatever you put into the dict might not evaluate into a simple type like int, str etc. For me this happened with the IntEnum, which appeared as <MyIntEnum.CONSTANT: 4> instead of 4, but it can happen with any complex object which will then appear like <object object at 0x7fbf08a0bdf0>.

So if you use the form:

session.execute(         INSERT INTO table (id, name)         VALUES (%(id)s, %(name)s),         {"id": 123456, "name": "example"} ) 

make sure that everything in your dict is actually a string, int, float etc.

That was not the problem in this question, but since it's another wrong encoding and this is the first Google hit for the question I hope this helps someone :)

like image 36
bjrne Avatar answered Sep 17 '22 15:09

bjrne