2014-07-26 7 views
5
CREATE TABLE users ( 
userID uuid, 
firstname text, 
lastname text, 
state text, 
zip int, 
age int, 
PRIMARY KEY (userID) 
); 

मैं निम्नलिखित क्वेरी बनाने के तरीके हैं:कैसंड्रा में रेंज क्वेरी कैसे बनाएं?

select * from users where age between 30 and 40 

select * from users where state in "AZ" AND "WA" 

मैं जानता हूँ कि मैं दो से अधिक टेबल की जरूरत है कि इस प्रश्न के ऐसा करने के लिए, लेकिन मुझे पता है कि होना चाहिए न?

select * from users where age IN (15,16,17,....30) 
:

संपादित

कार्लो की टिप्पणी से, मैं देख रहा हूँ कि यह केवल संभावना

CREATE TABLE users ( 
userID uuid, 
firstname text, 
lastname text, 
state text, 
zip int, 
age int, 
PRIMARY KEY (age,zip,userID) 
); 

अब 15 और 30 के बीच उम्र के साथ उपयोगकर्ता को चुनने के लिए यह केवल संभावना है

हालांकि, यहां ऑपरेटर का उपयोग करने की अनुशंसा नहीं की जाती है और विरोधी पैटर्न है।

आयु पर द्वितीयक सूचकांक बनाने के बारे में कैसे?

CREATE index users_age ON users(age) 

क्या यह मदद मिलेगी?

धन्यवाद

+0

भी देखें https://stackoverflow.com/q/11348158/32453 – rogerdpack

उत्तर

10

रेंज क्वेरी एक संभावित प्रश्न है। वास्तविक श्रेणी क्वेरी करने का तरीका क्लस्टरिंग भाग पर सीमा बनाने, एक यौगिक प्राथमिक कुंजी का उपयोग करना है। चूंकि श्रेणी क्लस्टरिंग भाग पर है, इसलिए आप जिन प्रश्नों को आपने लिखा है, वे नहीं कर सकते हैं: आपको कम से कम विभाजन कुंजी पर समान स्थिति की आवश्यकता है। चलो एक उदाहरण देखें:

CREATE TABLE users (
    mainland text, 
    state text, 
    uid int, 
    name text, 
    zip int, 
    PRIMARY KEY ((mainland), state, uid) 
) 

uid अब किसी पूर्णांक सिर्फ परीक्षण आसान

insert into users (mainland, state, uid, name, zip) VALUES ('northamerica', 'washington', 1, 'john', 98100); 
insert into users (mainland, state, uid, name, zip) VALUES ('northamerica', 'texas', 2, 'lukas', 75000); 
insert into users (mainland, state, uid, name, zip) VALUES ('northamerica', 'delaware', 3, 'henry', 19904); 
insert into users (mainland, state, uid, name, zip) VALUES ('northamerica', 'delaware', 4, 'dawson', 19910); 
insert into users (mainland, state, uid, name, zip) VALUES ('centraleurope', 'italy', 5, 'fabio', 20150); 
insert into users (mainland, state, uid, name, zip) VALUES ('southamerica', 'argentina', 6, 'alex', 10840); 

अब क्वेरी प्रदर्शन कर सकते हैं कि तुम क्या जरूरत है बनाने के लिए किया जाता है:

select * from users where mainland = 'northamerica' and state > 'ca' and state < 'ny'; 

आउटपुट

mainland | state | uid | name | zip 
-------------+----------+-----+--------+------- 
northamerica | delaware | 3 | henry | 19904 
northamerica | delaware | 4 | dawson | 19910 

यदि आप क्लस्टरिंग कुंजी के पहले कॉलम के रूप में एक int (आयु, ज़िपकोड) डालते हैं तो आप पूर्णांक की तुलना में वही क्वेरी कर सकते हैं।

देखभाल करें: इस स्थिति को देखते समय अधिकांश लोग सोचते हैं कि "ठीक है, मैं एक नकली विभाजन कुंजी डाल सकता हूं जो हमेशा समान होता है और फिर मैं रेंज क्वेरी कर सकता हूं"। यह एक बड़ी त्रुटि है, विभाजन कुंजी नोड्स में डेटा वितरण के लिए ज़िम्मेदार है। एक फिक्स विभाजन कुंजी सेट करना मतलब है कि सभी डेटा एक ही नोड (और इसकी प्रतिकृति में) में समाप्त हो जाएगा।

15/20 जोनों में विश्व क्षेत्र को विभाजित करना (15/20 विभाजन कुंजी रखने के लिए) कुछ है लेकिन पर्याप्त नहीं है और केवल वैध उदाहरण बनाने के लिए बनाया गया है।


संपादित करें: प्रश्न के संपादन की वजह से

मैंने ऐसा नहीं कहा कि यह केवल संभावना है; अगर आपको अपने उपयोगकर्ताओं को विभाजन करने का कोई वैध तरीका नहीं मिल रहा है और इस तरह की क्वेरी करने की आवश्यकता है तो यह एक संभावना है, केवल एक ही नहीं। रेंज क्वेरी क्लस्टरिंग कुंजी भाग पर किया जाना चाहिए। विभाजन कुंजी के रूप में एजीई का एक कमजोर बिंदु यह है कि आप उस पर एक अद्यतन नहीं कर सकते हैं, किसी भी समय आपको उस उपयोगकर्ता की उम्र को अपडेट करने की आवश्यकता होती है जब आपको एक डिलीट और एक डालने की ज़रूरत होती है (एक विकल्प जन्म_यायर/जन्म_डेट लिख सकता है और नहीं उम्र, और उसके बाद ग्राहक पक्ष की गणना करें)

द्वितीयक अनुक्रमणिका जोड़ने पर आपके प्रश्न का उत्तर देने के लिए: वास्तव में माध्यमिक अनुक्रमणिका पर प्रश्न ऑपरेटर में समर्थन नहीं करते हैं। CQL संदेश से ऐसा लगता है कि वे जल्द ही इसे विकसित करने के लिए जा रहे हैं

गलत अनुरोध: गैर-प्राथमिक कुंजी कॉलम (xxx) पर विधेय में अभी तक समर्थित

हालांकि भले ही नहीं है माध्यमिक सूचकांक ऑपरेटर में समर्थन आपकी क्वेरी बस मेरी अवधारणा को स्पष्ट करने से

select * from users where age IN (15,16,17,....30) 

परिवर्तन नहीं होगा: कुछ भी है कि एक "स्वच्छ" और "तैयार" समाधान नहीं है उपयोगकर्ता के प्रयास में डेटा मॉडल करने के लिए की आवश्यकता है एक तरीका है कि सैटिस इसकी जरूरतों को पूरा करें। एक उदाहरण बनाने के लिए (कि मैं यह कहना नहीं एक अच्छा समाधान है: मैं इसका इस्तेमाल नहीं होता)

insert into users (years_range, age , uid) VALUES ('11_15', 14, 1); 
insert into users (years_range, age , uid) VALUES ('26_30', 28, 3); 
insert into users (years_range, age , uid) VALUES ('16_20', 16, 2); 
insert into users (years_range, age , uid) VALUES ('26_30', 29, 4); 
insert into users (years_range, age , uid) VALUES ('41_45', 41, 5); 
insert into users (years_range, age , uid) VALUES ('21_25', 23, 5); 

क्वेरी डेटा

select * from users where years_range in('11_15', '16_20', '21_25', '26_30') and age > 14 and age < 29; 

उत्पादन

CREATE TABLE users (
    years_range text, 
    age int, 
    uid int, 
    PRIMARY KEY ((years_range), age, uid) 
) 

कुछ डेटा डाल

years_range | age | uid 
-------------+-----+----- 
     16_20 | 16 | 2 
     21_25 | 23 | 5 
     26_30 | 28 | 3 

यह समाधान वाई हल कर सकता है हमारी समस्या और एक छोटे समूह में इस्तेमाल किया जा सकता है, जहां लगभग 20 कुंजी (0_5 ... 106_110) का एक अच्छा वितरण हो सकता है। लेकिन यह समाधान, पहले की तरह, एक अद्यतन की अनुमति नहीं देता है और कुंजी के वितरण को कम करता है। लाभ यह है कि आपके पास छोटे सेट हैं।

एक परिपूर्ण दुनिया में जहां एसआई पहले से ही खंड में अनुमति देता है, मैं यूयूआईडी को विभाजन कुंजी के रूप में उपयोग करता हूं, सालों के रूप में वर्ष_श्रेणी (जन्म_यायर_रेंज के रूप में सेट) और मेरे डेटा क्लाइंट पक्ष को "फ़िल्टर" करता हूं (यदि 10> आयु> 22 में रुचि है मैं IN('1991_1995', '1996_2000', '2001_2005', '2006_2010', '2011_2015') के लिए पूछना होगा की गणना और अपने आवेदन पर unuseful वर्ष)

HTH, कार्लो

+0

ठीक दौरान primary key है जो इस मामले में uid देने के लिए नहीं है।लेकिन मैं उन सभी उपयोगकर्ताओं को कैसे प्राप्त करूं जहां आयु> 14 और आयु <30। अगर मेरी टेबल दिखती है तो मुझे यह देखना होगा। आपके मामले में, आप "WHERE मुख्य भूमि = 'नॉर्थमेरिका' का उपयोग करते हैं। मान लीजिए, मैं दुनिया भर के सभी उपयोगकर्ताओं से 14 से 30 वर्ष के उपयोगकर्ताओं को प्राप्त करना चाहता हूं –

+0

आपके द्वारा पूछे जाने वाले बॉक्स के लिए कोई समाधान नहीं है। आप ऑपरेटर का उपयोग करके जो पूछते हैं उसे प्राप्त कर सकते हैं: उदाहरण: उन लोगों से * चुनें जहां मुख्य भूमि IN ('नॉर्थमेरिका', 'दक्षिणमेरिका', 'यूरोप' ...) और आयु> 14 और आयु <30 ऐसा करने के लिए आपको इसकी आवश्यकता है सभी possibles विभाजन कुंजी पता है। यदि यह क्वेरी समय पर ज्ञात नहीं है तो आप 'आयु' कॉलम को विभाजन कुंजी के रूप में सेट कर सकते हैं और केवल IN ऑपरेटर उपयोगकर्ताओं का चयन करें, जहां से आयु (15, 16, 17 ... 27, 28, 2 9) हालांकि आईएन ऑपरेटर में बहुत सी कुंजी होने के बावजूद इसे एक विरोधी पैटर्न माना जाता है - उम्र की सीमा के लिए हालांकि आपके पास अधिकतम 100 कुंजी हो सकती हैं ... –

+0

कृपया नीचे मेरा उत्तर देखें और अपनी राय –

1

मैंने पाया कि allow filtering का उपयोग कर, मैं सीमा के लिए क्वेरी कर सकते हैं को हटाने: उदाहरण यहाँ है:

CREATE TABLE users2 (
    mainland text, 
    state text, 
    uid int, 
    name text, 
    age int, 
    PRIMARY KEY (uid, age, state) 
) ; 

insert into users2 (mainland, state, uid, name, age) VALUES ('northamerica', 'washington', 1, 'john', 81); 
insert into users2 (mainland, state, uid, name, age) VALUES ('northamerica', 'texas', 1, 'lukas', 75); 
insert into users2 (mainland, state, uid, name, age) VALUES ('northamerica', 'delaware', 1, 'henry', 19); 
insert into users2 (mainland, state, uid, name, age) VALUES ('northamerica', 'delaware', 4, 'dawson', 90); 
insert into users2 (mainland, state, uid, name, age) VALUES ('centraleurope', 'italy', 5, 'fabio', 50); 
insert into users2 (mainland, state, uid, name, age) VALUES ('southamerica', 'argentina', 6, 'alex', 40); 

select * from users2 where age>50 and age<=100 allow filtering; 

    uid | age | state  | mainland  | name 
-----+-----+------------+--------------+-------- 
    1 | 75 |  texas | northamerica | lukas 
    1 | 81 | washington | northamerica | john 
    2 | 75 |  texas | northamerica | lukas 
    4 | 90 | delaware | northamerica | dawson 

(4 rows) 

मुझे यकीन नहीं है कि यह प्रदर्शन हत्यारा है या नहीं। लेकिन यह काम करने लगता है। दरअसल, मैं भी query execution

+2

फ़िल्टरिंग की अनुमति दें प्रदर्शन हत्यारा क्योंकि यह आपके डेटा तक सीधे पहुंच नहीं करता है, यह सभी नोड्स में सभी तालिका विभाजन स्कैन करेगा। जब नया प्रश्न होता है तो आप बेहतर रूप से एक नया धागा बनाते हैं क्योंकि अन्य उपयोगकर्ताओं के लिए रेंज पूछताछ के बारे में बात करते हुए थ्रेड पर टिप्पणी में फ़िल्टरिंग की अनुमति देने के बारे में जानकारी प्राप्त करना आसान नहीं होगा। सादर –

+0

मैंने इसे यहां पोस्ट किया क्योंकि 'फ़िल्टरिंग की अनुमति' का उपयोग करके मैं रेंज क्वेरी काम करने में सक्षम हूं। –

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