খুদে শয়তান। টিপ:
যখনই আপনার কাছে ভারী ওজন সূচনা হয়েছে যা RDD
একবারে RDD
উপাদান হিসাবে একবার করার চেয়ে একবারে অনেকগুলি উপাদানের জন্য একবার করা উচিত এবং যদি এই সূচনাটি যেমন তৃতীয় পক্ষের লাইব্রেরি থেকে অবজেক্ট তৈরি করা হয় তবে সিরিয়ালায়িত করা যায় না (যাতে স্পার্ক এটি ক্লাস্টারে জুড়ে প্রেরণ করতে পারে কর্মী নোড), mapPartitions()
পরিবর্তে ব্যবহার করুন
map()
। mapPartitions()
কর্মী / থ্রেড / পার্টিশন প্রতি কর্মী প্রতি RDD
ডাটা উপাদান হিসাবে একবার করার পরিবর্তে একবার করার জন্য আরম্ভ করার ব্যবস্থা করে : নীচে দেখুন।
val newRd = myRdd.mapPartitions(partition => {
val connection = new DbConnection /*creates a db connection per partition*/
val newPartition = partition.map(record => {
readMatchingFromDB(record, connection)
}).toList // consumes the iterator, thus calls readMatchingFromDB
connection.close() // close dbconnection here
newPartition.iterator // create a new iterator
})
Q2 এর। না flatMap
মানচিত্র মত বা মত আচরণ mapPartitions
?
হ্যাঁ. দয়া করে এর 2 উদাহরণ দেখুন flatmap
.. এর স্ব ব্যাখ্যাযোগ্য।
চতুর্থাংশ 1। আরডিডি map
এবং এর মধ্যে পার্থক্য কীmapPartitions
map
mapPartitions
পার্টিশন পর্যায়ে ফাংশনটি অনুশীলন করার সময় প্রতিটি উপাদান স্তরে ব্যবহার করা হচ্ছে ফাংশনটি কাজ করে
।
উদাহরণ দৃশ্যপট : যদি আমরা একটি বিশেষ 100K উপাদান আছেRDD
পার্টিশন তারপর আমরা ফাংশন বন্ধ করো ম্যাপিং রূপান্তর দ্বারা ব্যবহৃত হচ্ছে 100K বার যখন আমরা ব্যবহার করবেmap
।
বিপরীতভাবে, আমরা যদি ব্যবহার করি mapPartitions
তবে আমরা কেবলমাত্র একবার নির্দিষ্ট ফাংশনটি কল করব, তবে আমরা সমস্ত 100 কে রেকর্ডে পাস করব এবং একটি ফাংশন কলে সমস্ত প্রতিক্রিয়া ফিরে পাব।
map
একটি বিশেষ ফাংশনটিতে এতবার কাজ করার পরে কার্যকারিতা লাভ হবে , বিশেষত যদি ফাংশনটি প্রতিবার ব্যয়বহুল কিছু করে যা যদি আমরা সমস্ত উপাদানগুলিতে একবারে (ক্ষেত্রে ক্ষেত্রে mappartitions
) পাস করি তবে এটি করার প্রয়োজন হবে না ।
মানচিত্র
আরডিডির প্রতিটি আইটেমে একটি রূপান্তর ফাংশন প্রয়োগ করে এবং ফলাফলটি নতুন আরডিডি হিসাবে দেয়।
তালিকা বৈকল্পিক
Def মানচিত্র [ইউ: ক্লাসট্যাগ] (চ: টি => ইউ): আরডিডি [ইউ]
উদাহরণ:
val a = sc.parallelize(List("dog", "salmon", "salmon", "rat", "elephant"), 3)
val b = a.map(_.length)
val c = a.zip(b)
c.collect
res0: Array[(String, Int)] = Array((dog,3), (salmon,6), (salmon,6), (rat,3), (elephant,8))
mapPartitions
এটি একটি বিশেষায়িত মানচিত্র যা প্রতিটি বিভাজনের জন্য কেবল একবার ডাকা হয়। সংশ্লিষ্ট পার্টিশনের পুরো সামগ্রীটি ইনপুট আর্গুমেন্টের (আইট্রেটর [টি]) এর মাধ্যমে মানগুলির ক্রমানুসারে স্ট্রিম হিসাবে উপলব্ধ। কাস্টম ফাংশন অবশ্যই অন্য আইট্রেটার [ইউ] ফিরে আসতে হবে। সম্মিলিত ফলাফল পুনরাবৃত্তি স্বয়ংক্রিয়ভাবে একটি নতুন আরডিডিতে রূপান্তরিত হয়। দয়া করে মনে রাখবেন, টিউপসগুলি (3,4) এবং (6,7) নীচের ফলাফল থেকে অনুপস্থিত যা আমরা বেছে নিয়েছি বিভাজনের কারণে।
preservesPartitioning
ইনপুট ফাংশন পার্টিশনর সংরক্ষণ করে কিনা তা নির্দেশ করে, এটি হওয়া উচিত false
যদি না এটি একটি জোড় আরডিডি হয় এবং ইনপুট ফাংশনটি কীগুলি পরিবর্তন না করে।
তালিকা বৈকল্পিক
Def map পার্টিশনগুলি [ইউ: ক্লাসট্যাগ] (চ: আইট্রেটার [টি] => আইট্রেটার [ইউ], সংরক্ষণের পার্টিশন: বুলিয়ান = মিথ্যা): আরডিডি [ইউ]
উদাহরণ 1
val a = sc.parallelize(1 to 9, 3)
def myfunc[T](iter: Iterator[T]) : Iterator[(T, T)] = {
var res = List[(T, T)]()
var pre = iter.next
while (iter.hasNext)
{
val cur = iter.next;
res .::= (pre, cur)
pre = cur;
}
res.iterator
}
a.mapPartitions(myfunc).collect
res0: Array[(Int, Int)] = Array((2,3), (1,2), (5,6), (4,5), (8,9), (7,8))
উদাহরণ 2
val x = sc.parallelize(List(1, 2, 3, 4, 5, 6, 7, 8, 9,10), 3)
def myfunc(iter: Iterator[Int]) : Iterator[Int] = {
var res = List[Int]()
while (iter.hasNext) {
val cur = iter.next;
res = res ::: List.fill(scala.util.Random.nextInt(10))(cur)
}
res.iterator
}
x.mapPartitions(myfunc).collect
// some of the number are not outputted at all. This is because the random number generated for it is zero.
res8: Array[Int] = Array(1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 7, 7, 7, 9, 9, 10)
উপরের প্রোগ্রামটি নীচে ফ্ল্যাটম্যাপ ব্যবহার করেও লেখা যেতে পারে।
ফ্ল্যাটম্যাপ ব্যবহার করে উদাহরণ 2
val x = sc.parallelize(1 to 10, 3)
x.flatMap(List.fill(scala.util.Random.nextInt(10))(_)).collect
res1: Array[Int] = Array(1, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10)
উপসংহার:
mapPartitions
রূপান্তরটি তত দ্রুত হয় map
যেহেতু এটি আপনার ফাংশনটিকে একবার / পার্টিশনকে একবার বলায় / একবার / উপাদান হিসাবে নয় ..
আরও পঠন: ফোরচ বনাম পূর্বাঙ্গ বিভাগ কখন ব্যবহার করবেন?