জাস্টিনের উত্তর দুর্দান্ত এবং এই প্রতিক্রিয়া আরও গভীরতর মধ্যে যায়।
repartition
অ্যালগরিদম একটি পূর্ণ এলোমেলো করে এবং ডেটা সমানভাবে বিতরণ হচ্ছে সাথে নতুন পার্টিশন তৈরি করে। 1 থেকে 12 নম্বর সহ একটি ডেটা ফ্রেম তৈরি করা যাক।
val x = (1 to 12).toList
val numbersDf = x.toDF("number")
numbersDf
আমার মেশিনে 4 টি পার্টিশন রয়েছে।
numbersDf.rdd.partitions.size // => 4
পার্টিশনের উপর ডেটা কীভাবে ভাগ করা যায় তা এখানে:
Partition 00000: 1, 2, 3
Partition 00001: 4, 5, 6
Partition 00002: 7, 8, 9
Partition 00003: 10, 11, 12
আসুন repartition
পদ্ধতিটির সাথে একটি পূর্ণ শ্যফেল করুন এবং দুটি নোডে এই ডেটাটি নিয়ে আসি।
val numbersDfR = numbersDf.repartition(2)
numbersDfR
আমার মেশিনে ডেটা কীভাবে বিভক্ত করা হয়েছে তা এখানে :
Partition A: 1, 3, 4, 6, 7, 9, 10, 12
Partition B: 2, 5, 8, 11
repartition
পদ্ধতি নতুন পার্টিশন করে তোলে এবং সমানভাবে নতুন পার্টিশন ডাটা বিতরণ (ডাটা বন্টন আরো এমনকি বড় ডেটা সেটের জন্য) হয়।
coalesce
এবং মধ্যে পার্থক্যrepartition
coalesce
যে পরিমাণে ডেটা বদলে গেছে তা হ্রাস করতে বিদ্যমান পার্টিশন ব্যবহার করে। repartition
নতুন পার্টিশন তৈরি করে এবং পুরো শ্যাফেল করে। coalesce
বিভিন্ন পরিমাণে ডেটা (অনেক সময় পার্টিশনের মধ্যে অনেক বেশি আকার রয়েছে) এর repartition
পার্টিশনের ফলাফল এবং প্রায় সমান আকারের পার্টিশনের ফলাফল।
কি coalesce
বা repartition
দ্রুততর?
coalesce
তুলনায় দ্রুত চলতে পারে repartition
, তবে অসম আকারের পার্টিশনগুলি সমান আকারের পার্টিশনের তুলনায় সাধারণত ধীর হয়। একটি বড় ডেটা সেট ফিল্টার করার পরে আপনার সাধারণত ডেটাসেটগুলি পুনরায় ভাগ করতে হবে। আমি repartition
সামগ্রিকভাবে দ্রুত হতে পেরেছি কারণ স্পার্ক সমান আকারের পার্টিশনগুলির সাথে কাজ করতে নির্মিত।
এনবি আমি কৌতূহলবশত পর্যবেক্ষণ করেছি যে পুনরায় বিভাজন ডিস্কে ডেটার আকার বাড়াতে পারে । আপনি যখন বড় ডেটাসেটগুলিতে বিভাগ / coalesce ব্যবহার করছেন তখন পরীক্ষা চালানোর বিষয়ে নিশ্চিত হন।
আপনি আরও বিশদ জানতে চাইলে এই ব্লগ পোস্টটি পড়ুন ।
আপনি যখন অনুশীলনে কোলেসেস এবং পার্টিশন ব্যবহার করবেন
minimize data movement
পরিবর্তে ভাল বলা উচিত ছিলavoiding data movement
।