2011-01-12 13 views
6

में समय सीमा संग्रहीत करना मैं बाद में इसे कुशलतापूर्वक पुनर्प्राप्त करने में सक्षम होने के लिए, समय सीमा से जुड़े डेटा को स्टोर करने का एक अच्छा तरीका ढूंढ रहा हूं।कैसंड्रा

डेटा की प्रत्येक प्रविष्टि को (start time, end time, value) के रूप में सरल बनाया जा सकता है। मुझे बाद में (x, y) रेंज के अंदर आने वाली सभी प्रविष्टियों को पुनर्प्राप्त करने की आवश्यकता होगी। एसक्यूएल में, क्वेरी

SELECT value FROM data WHERE starttime <= x AND endtime >= y

की तरह कुछ हो तुम कैसेंड्रा में डेटा जो मुझे इस तरह के प्रश्नों कुशलता से प्रदर्शन करने के लिए अनुमति होगी के लिए एक ढांचा सुझाव दे सकते हैं हैं?

उत्तर

6

यह कुशलता से मॉडल करने के लिए एक अजीब मुश्किल बात है।

मुझे लगता है कि कैसंड्रा के माध्यमिक इंडेक्स का उपयोग करना (एक डमी अनुक्रमित मूल्य के साथ दुर्भाग्य से अभी भी इस समय जरूरी है) आपका सबसे अच्छा विकल्प है। आपको प्रति पंक्ति एक पंक्ति का उपयोग कम से कम तीन कॉलम के साथ करना होगा: 'स्टार्ट', 'एंड' और 'डमी'। इनमें से प्रत्येक पर एक माध्यमिक सूचकांक बनाएँ। पहले दो लॉन्ग टाइप हो सकते हैं और अंतिम बाइट्स टाइप हो सकता है। अधिक जानकारी के लिए this post on using secondary indexes देखें। चूंकि आपको द्वितीयक इंडेक्स क्वेरी (दुर्भाग्यपूर्ण आवश्यकता का उल्लेख किया गया) के लिए कम से कम एक कॉलम पर एक ईक्यू अभिव्यक्ति का उपयोग करना है, इसलिए ईक्यू 'डमी' पर होगा, जो हमेशा 0 पर सेट हो सकता है (इसका मतलब है कि ईक्यू इंडेक्स एक्सप्रेशन प्रत्येक पंक्ति से मेल खाएगा और अनिवार्य रूप से नो-ऑप होगा।) आप प्रारंभ, अंत और डमी के साथ पंक्ति में शेष ईवेंट डेटा स्टोर कर सकते हैं।

pycassa में, एक अजगर कैसेंड्रा ग्राहक, आपकी क्वेरी इस प्रकार दिखाई देगा:

from pycassa.index import * 
start_time = 12312312000 
end_time = 12312312300 
start_exp = create_index_expression('start', start_time, GT) 
end_exp = create_index_expression('end', end_time, LT) 
dummy_exp = create_index_expression('dummy', 0, EQ) 
clause = create_index_clause([start_exp, end_exp, dummy_exp], count=1000) 
for result in entries.get_indexed_slices(clause): 
    # do stuff with result 

अन्य क्लाइंट में कुछ इसी तरह होनी चाहिए।

विकल्प जिसे मैंने पहले माना था ऑर्डरप्रेशिंग पार्टिशनर, जो लगभग हमेशा एक बुरी बात है। इंडेक्स के लिए, आप स्टार्ट टाइम को पंक्ति कुंजी और कॉलम नाम के रूप में फिनिश टाइम के रूप में उपयोग करेंगे। फिर आप start_key = start_time और column_finish = finish_time के साथ एक रेंज स्लाइस कर सकते हैं। यह प्रारंभ समय के बाद प्रत्येक पंक्ति को स्कैन करेगा और फिनिश_टाइम से पहले कॉलम के साथ ही उन्हें वापस कर देगा। बहुत कुशल नहीं है, और आपको एक बड़ा मल्टीगेट करना है, आदि। अंतर्निहित माध्यमिक सूचकांक दृष्टिकोण बेहतर है क्योंकि नोड केवल स्थानीय डेटा को इंडेक्स करेंगे और अधिकांश बॉयलरप्लेट इंडेक्सिंग कोड आपके लिए संभाला जाएगा।

संबंधित मुद्दे