सबसे पहले आपके द्वारा की जाने वाली सभी प्रकार की क्वेरी अत्यंत अक्षम हैं। अभी के लिए (स्पार्क 1.5.0 *) इस तरह से जुड़ने के लिए, प्रत्येक बार क्वेरी निष्पादित होने पर दोनों तालिकाओं को फेरबदल/हैश-विभाजन करना पड़ता है। users
. के मामले में यह कोई समस्या नहीं होनी चाहिए तालिका जहां user_id = 123
विधेय को संभवतः पुश-डाउन किया जाता है लेकिन फिर भी user_address
. पर पूर्ण फेरबदल की आवश्यकता होती है .
इसके अलावा, यदि टेबल केवल पंजीकृत हैं और कैश्ड नहीं हैं, तो इस क्वेरी के प्रत्येक निष्पादन से एक संपूर्ण user_address
प्राप्त होगा। MySQL से स्पार्क तक तालिका।
यह बिल्कुल स्पष्ट नहीं है कि आप एप्लिकेशन के लिए स्पार्क का उपयोग क्यों करना चाहते हैं, लेकिन सिंगल मशीन सेटअप, छोटे डेटा और प्रकार के प्रश्नों से पता चलता है कि स्पार्क यहां उपयुक्त नहीं है।
सामान्यतया यदि एप्लिकेशन लॉजिक के लिए एकल रिकॉर्ड एक्सेस की आवश्यकता होती है तो स्पार्क SQL अच्छा प्रदर्शन नहीं करेगा। यह विश्लेषणात्मक प्रश्नों के लिए डिज़ाइन किया गया है न कि OLTP डेटाबेस प्रतिस्थापन के रूप में।
यदि कोई एकल तालिका/डेटा फ़्रेम बहुत छोटा है तो आप प्रसारण का प्रयास कर सकते हैं।
import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.functions.broadcast
val user: DataFrame = ???
val user_address: DataFrame = ???
val userFiltered = user.where(???)
user_addresses.join(
broadcast(userFiltered), $"address_id" === $"user_address_id")
* इसे स्पार्क 1.6.0 में SPARK-11410 के साथ बदलना चाहिए जो लगातार तालिका विभाजन को सक्षम करना चाहिए।