খুদে শয়তান। টিপ:
যখনই আপনার কাছে ভারী ওজন সূচনা হয়েছে যা 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
mapmapPartitionsপার্টিশন পর্যায়ে ফাংশনটি অনুশীলন করার সময় প্রতিটি উপাদান স্তরে ব্যবহার করা হচ্ছে ফাংশনটি কাজ করে
।
উদাহরণ দৃশ্যপট : যদি আমরা একটি বিশেষ 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যেহেতু এটি আপনার ফাংশনটিকে একবার / পার্টিশনকে একবার বলায় / একবার / উপাদান হিসাবে নয় ..
আরও পঠন: ফোরচ বনাম পূর্বাঙ্গ বিভাগ কখন ব্যবহার করবেন?