2015-11-12 15 views
5

करने के लिए वापस हो रही है मैं जब स्काला के साथ चिंगारी में डेटा फ्रेम के साथ काम कर रहे एक कठिनाई होती है। यदि मेरे पास डेटा फ्रेम है जो मैं अद्वितीय प्रविष्टियों के कॉलम को निकालना चाहता हूं, जब मैं groupBy का उपयोग करता हूं तो मुझे डेटा फ्रेम वापस नहीं मिलता है।स्पार्क में GroupBy का उपयोग करना और एक DataFrame

उदाहरण के लिए, मैं एक DataFrame बुलाया लॉग निम्न रूप है कि है:

machine_id | event  | other_stuff 
34131231 | thing  | stuff 
83423984 | notathing | notstuff 
34131231 | thing | morestuff 

और मैं जहां घटना बात एक नए DataFrame में संग्रहित है अद्वितीय मशीन आईडी चाहते हैं मुझे कुछ छानने करने के लिए अनुमति देने के लिए किसी तरह की। का उपयोग करते हुए

val machineId = logs 
    .where($"event" === "thing") 
    .select("machine_id") 
    .groupBy("machine_id") 

मैं जो (या मैं कैसे ठीक वस्तु इस तरह का उपयोग करने के लिए पता नहीं है) बट का उपयोग करने में एक दर्द है वापस समूहीकृत आंकड़ों की एक वैल मिलता है। अद्वितीय मशीन आईडी की यह सूची प्राप्त करने के बाद, मैं व्यक्तिगत मशीन आईडी के लिए सभी ईवेंट निकालने के लिए इसे DataFrame फ़िल्टर करने में इसका उपयोग करना चाहता हूं।

मैं मैं काफी नियमित रूप से बात इस तरह का क्या करना चाहता हूँ देख सकते हैं और बुनियादी कार्यप्रवाह है:

  1. निकालें विशिष्ट आईडी एक लॉग मेज से की।
  2. किसी विशेष आईडी के लिए सभी ईवेंट निकालने के लिए अद्वितीय आईडी का उपयोग करें।
  3. इस डेटा को उस निकाला गया है पर विश्लेषण के कुछ प्रकार का उपयोग करें।

यह पहला दो कदम है जो मैं यहां कुछ मार्गदर्शन की सराहना करता हूं।

मैं इस उदाहरण की सराहना करते हैं एक तरह से काल्पनिक है, लेकिन उम्मीद है कि यह बताता है कि मेरी मुद्दा है। हो सकता है कि मुझे GroupedData ऑब्जेक्ट्स के बारे में पर्याप्त जानकारी न हो या (जैसा कि मैं उम्मीद कर रहा हूं) मुझे डेटा फ्रेम में कुछ याद आ रहा है जो इसे आसान बनाता है। मैं स्काला 2.10.4 पर निर्मित स्पार्क 1.5 का उपयोग कर रहा हूं।

धन्यवाद

उत्तर

7

बस distinct नहीं groupBy का उपयोग करें:

val machineId = logs.where($"event"==="thing").select("machine_id").distinct 

कौन सा एसक्यूएल के बराबर होगी:

SELECT DISTINCT machine_id FROM logs WHERE event = 'thing' 

GroupedData सीधे इस्तेमाल किया जा करने का इरादा नहीं है। यह तरीकों की एक संख्या है, जहां agg सबसे सामान्य है, जो विभिन्न कुल कार्यों लागू करते हैं और इसे वापस कन्वर्ट DataFrame करने के लिए इस्तेमाल किया जा सकता है। एसक्यूएल के संदर्भ में आप where के बाद क्या और groupBy इस

SELECT machine_id, ... FROM logs WHERE event = 'thing' GROUP BY machine_id 

जहां ...agg या समकक्ष विधि द्वारा प्रदान किया जाना है की तरह कुछ के बराबर है।

1

स्पार्क में एक समूह समेकन के बाद और फिर एक चयन कथन डेटा फ्रेम वापस कर देगा। आपके उदाहरण के लिए यह होना चाहिए कुछ की तरह:

val machineId = logs 
    .groupBy("machine_id", "event") 
    .agg(max("other_stuff")) 
    .select($"machine_id").where($"event" === "thing") 
संबंधित मुद्दे