2016-11-02 16 views
5

में प्रत्येक विभाजन कुंजी के लिए पहली पंक्ति प्राप्त करें मैं डेटा कटअप करने के लिए अपने ईटीएल नौकरी के दौरान एक मध्यवर्ती भंडारण के रूप में कैसंद्रा को विचार कर रहा हूं।कैसंड्रा

आइए कल्पना करें कि मेरे पास घटनाओं की एक धारा है, उनमें से प्रत्येक के पास कुछ व्यावसायिक इकाई आईडी, टाइमस्टैम्प और कुछ मूल्य है। मुझे प्रत्येक व्यवसाय कुंजी के लिए इन-इवेंट टाइमस्टैम्प के मामले में केवल नवीनतम मूल्य प्राप्त करने की आवश्यकता है, लेकिन ईवेंट अनियंत्रित हो सकते हैं।

CREATE TABLE sample_keyspace.table1_copy1 (
id uuid, 
time timestamp, 
value text, 
PRIMARY KEY (id, time) 
) WITH CLUSTERING ORDER BY (time DESC) 

अब अगर मैं इस तालिका में कुछ डेटा सम्मिलित मैं कुछ दिया विभाजन के लिए नवीनतम मूल्य प्राप्त कर सकते हैं:

मेरा विचार एक विभाजन कुंजी और टाइमस्टैम्प एक क्लस्टरिंग कुंजी के रूप में के रूप में कारोबार आईडी के साथ मचान तालिका बनाने के लिए था कुंजी:।

select * from table1 where id = 96b29b4b-b60b-4be9-9fa3-efa903511f2d limit 1; 

लेकिन वह हर व्यवसाय कुंजी मैं में दिलचस्पी रखता हूँ के लिए इस तरह के प्रश्न जारी करने के लिए की आवश्यकता होगी

वहाँ कुछ प्रभावी तरीके से मैं कर सकता है यह सीक्यूएल में?

मुझे पता है कि हमारे पास सभी उपलब्ध विभाजन कुंजी सूचीबद्ध करने की क्षमता है (select distinct id from table1 द्वारा)। तो अगर मैं कैसंद्रा के भंडारण मॉडल को देखता हूं, तो प्रत्येक विभाजन कुंजी के लिए पहली पंक्ति प्राप्त करना बहुत कठिन नहीं होना चाहिए।

क्या यह समर्थित है?

उत्तर

13

आप 3.6 के बाद एक संस्करण का उपयोग कर रहे हैं, वहाँ PER PARTITION LIMIT (CASSANDRA-7017) नामक आपकी क्वेरी आप 1 करने के लिए सेट कर सकते हैं, जिस पर एक विकल्प है। यह cqlsh में CASSANDRA-12803 के साथ 3.10 तक स्वतः पूर्ण नहीं होगा।

SELECT * FROM table1 PER PARTITION LIMIT 1; 
0

एक शब्द में: नहीं।

विभाजन कुंजी यही कारण है कि कैसंद्रा अनिवार्य रूप से किसी भी मात्रा में डेटा काम कर सकता है: यह निर्णय लेता है कि विभाजन कुंजी के हैश का उपयोग करके डेटा कहां रखा/देखना है। यही कारण है कि सीक्यूएल चयनों को हमेशा संपूर्ण विभाजन कुंजी पर एक समानता फ़िल्टर करने की आवश्यकता होती है। प्रत्येक id के लिए पहले time को खोजने के लिए, कैसंद्रा को डेटा के किसी भी विभाजन के लिए सभी नोड्स पूछना होगा, फिर उनमें से प्रत्येक पर एक जटिल संचालन करें। रिलेशनल डेटाबेस इस अनुमति देते हैं, कैसंद्रा नहीं करता है। यह सब पूर्ण टेबल स्कैन (SELECT * from table1), या विभाजन स्कैन (SELECT DISTINCT id FROM table1) की अनुमति देता है, लेकिन वे किसी भी जटिल ऑपरेशन से जुड़े नहीं हो सकते हैं।

*) मैं यहां ALLOW FILTERING छोड़ रहा हूं, क्योंकि यह इस संदर्भ में सहायता नहीं करता है।