On 7/26/10 7:06 PM, Dave Viner wrote:
AFAIK, atomic increments are not available. There recently has been
quite a bit of discussion about them. So, you might search the archives.
Dave Viner
On Mon, Jul 26, 2010 at 7:02 PM, Mark <static.void....@gmail.com
<mailto:static.void....@gmail.com>> wrote:
On 7/26/10 6:06 PM, Dave Viner wrote:
I'd love to hear other's opinions here... but here are my 2 cents.
With Cassandra, you need to think of the queries - which you've
pretty much done.
For the most popular queries, you could do something like:
<ColumnFamily Name="QueriesCounted"
ComparesWith="UTF8Type"
/>
And then access it as:
key-space.QueriesCounted['query-foo-bar'] = $count;
This makes it easy to get the count for any particular query.
I'm not sure the best way to store the "top counts" idea.
Perhaps a secondary process which iterates over all the queries
to see which sorts the query values by count, and then stores
them into another ColumnFamily.
You could use the same idea for the last query (session ids by query)
<ColumnFamily Name="QueriesRecorded"
ComparesWith="UTF8Type"
ColumnType="super"
CompareSubcolumnsWith="TimeUUIDType"
/>
And then access it as:
key-space. QueriesRecorded['query-foo-bar'][timeuuid] = session-id;
Actually, if you used that idea (queries-recorded), you could
generate the counts and aggregates from that directly in a hadoop
post-processing...
But perhaps others will have better ideas. If you haven't read
http://arin.me/blog/wtf-is-a-supercolumn-cassandra-data-model, go
read it now. It won't answer your question directly, but will
describe the process of modeling a blog in cassandra so you can
get a sense of the process.
Dave Viner
On Mon, Jul 26, 2010 at 4:46 PM, Mark <static.void....@gmail.com
<mailto:static.void....@gmail.com>> wrote:
We are thinking about using Cassandra to store our search
logs. Can someone point me in the right direction/lend some
guidance on design? I am new to Cassandra and I am having
trouble wrapping my head around some of these new concepts.
My brain keeps wanting to go back to a RDBMS design.
We will be storing the user query, # of hits returned and
their session id. We would like to be able to answer the
following questions.
- What is the n most popular queries and their counts within
the last x (mins/hours/days/etc). Basically the most popular
searches within a given time range.
- What is the most popular query within the last x where hits
= 0. Same as above but with an extra "where" clause
- For session id x give me all their other queries
- What are all the session ids that searched for 'foos'
We accomplish the above functionality w/ MySQL using 2
tables. One for the raw search log information and the other
to keep the aggregate/running counts of queries.
Would this sort of ad-hoc querying be better implemented
using Hadoop + Hive? If so, should I be storing all this
information in Cassandra then using Hadoop to retrieve it?
Thanks for your suggestions
"Perhaps a secondary process which iterates over all the queries
to see which sorts the query values by count, and then stores them
into another ColumnFamily."
- I was trying to avoid this. Is there some sort of atomic
increment feature available? I guess I could do the same thing we
are currently doing which is...
a) store full query details into table A
b) query table B for aggregate count of query 'foo' then store
count + 1
Thanks Ill look into that.
Say I am trying to model something like this:
SearchLogs : {
foo : {
TimeUUID_1 : {
session : af55e102b67c2de27bf12024ac0e7798
user_id : mr jiggles
}
TimeUUID_2 : {
....
}
}
bar : {
.....
}
}
Would this be my config?
<ColumnFamily Name="SearchLogs"
ColumnType="Super"
ComparesWith="BytesType"
CompareSubcolumnsWith="TimeUUIDType"/>
So basically MyCompany.SearchLogs['foo'] would return an array of hashes
ordered by time. Is this correct?