স্পার্ক করুন, একক আরডিডিটিকে দুটিতে বিভক্ত করুন


10

আমার কাছে একটি বড় ডেটাসেট রয়েছে যা নির্দিষ্ট পরামিতি অনুসারে আমাকে গ্রুপে বিভক্ত করতে হবে। আমি চাই চাকরিটি যথাসম্ভব দক্ষতার সাথে প্রক্রিয়াজাত করা হোক। আমি এটি করার দুটি উপায় কল্পনা করতে পারি

বিকল্প 1 - মূল আরডিডি এবং ফিল্টার থেকে মানচিত্র তৈরি করুন

def customMapper(record):
    if passesSomeTest(record):
        return (1,record)
    else:
        return (0,record)

mappedRdd = rddIn.map(lambda x: customMapper(x))
rdd0 = mappedRdd.filter(lambda x: x[0]==0).cache()
rdd1 = mappedRdd.filter(lambda x: x[1]==1).cache()

বিকল্প 2 - সরাসরি আরডিডি ফিল্টার করুন

def customFilter(record):
    return passesSomeTest(record)

rdd0 = rddIn.filter(lambda x: customFilter(x)==False).cache()
rdd1 = rddIn.filter(customFilter).cache()

মুষ্টি পদ্ধতিতে 3 বার মূল ডেটা সেট করা সমস্ত রেকর্ডের উপর ক্ষয় করতে হয়, যেখানে দ্বিতীয়টি সাধারণত দু'বার করতে হয়, সাধারণ পরিস্থিতিতে, তবে, স্পার্ক কিছুটা পর্দার আড়ালে গ্রাফ বিল্ডিং করে, তাই আমি কল্পনা করতে পারি যে সেগুলি কার্যকরভাবে একইভাবে সম্পন্ন। আমার প্রশ্নগুলি হ'ল: ক।) একটি পদ্ধতি কি অন্যের চেয়ে বেশি দক্ষ, বা স্পার্ক গ্রাফ বিল্ডিং তাদের সমতুল্য করে তোলে খ।) একক পাসে এই বিভাজন করা কি সম্ভব?


আমিও খুব সাদৃশ্যপূর্ণ একটি সমস্যা পেয়ে আমার আত্ম খুঁজে পেয়েছি এবং সত্যই এর সমাধান খুঁজে পাইনি। তবে আসলে যা ঘটে তা এই কোড থেকে পরিষ্কার নয়, কারণ স্পার্কের 'অলস মূল্যায়ন' রয়েছে এবং এটি বাস্তবায়নের জন্য প্রয়োজনীয় যা কেবল তা কার্যকর করতে সক্ষম, এবং মানচিত্র, ফিল্টার এবং একসাথে যা কিছু করা যায় তা সংমিশ্রণে সক্ষম। তাই সম্ভবত তোমরা যা বর্ণনা করতে পারে একটি একক পাস ঘটতে। যদিও বলার জন্য অলস মূল্যায়ন পদ্ধতির সাথে যথেষ্ট পরিচিত নয়। আসলে আমি কেবল। ক্যাশে () লক্ষ্য করেছি noticed কেবলমাত্র একটি। ক্যাশে () করার এবং সম্পূর্ণ ফলাফল পাওয়ার উপায় আছে?
ব্যবহারকারী 3780968

উত্তর:


9

সবার আগে আমাকে বলতে দাও যে আমি কোনও স্পার্ক বিশেষজ্ঞ নই; আমি গত কয়েক মাসে এটি বেশ ব্যবহার করেছি এবং আমি বিশ্বাস করি যে আমি এখন এটি বুঝতে পারি তবে আমি ভুল হতে পারি।

সুতরাং, আপনার প্রশ্নের উত্তর:

ক।) এগুলি সমতুল্য, তবে আপনি যেভাবে দেখছেন তা নয়; আপনি যদি ভাবছেন তবে স্পার্ক গ্রাফটি অপ্টিমাইজ করবে না, তবে customMapperউভয় ক্ষেত্রেই দু'বার কার্যকর করা হবে; এটি স্পার্কের জন্য, rdd1এবং rdd2দুটি সম্পূর্ণ ভিন্ন আরডিডি হ'ল এবং এটি পাতা থেকে শুরু করে ট্রান্সফর্মেশন গ্রাফের নীচে আপ তৈরি করবে; সুতরাং বিকল্প 1 এতে অনুবাদ করবে:

rdd0 = rddIn.map(lambda x: customMapper(x)).filter(lambda x: x[0]==0).cache()
rdd1 = rddIn.map(lambda x: customMapper(x)).filter(lambda x: x[0]==1).cache()

যেমনটি আপনি বলেছিলেন, customMapperদু'বার মৃত্যুদণ্ড কার্যকর করা হয়েছে (তদ্ব্যতীত, এছাড়াও rddInদু'বার পড়া হবে, যার অর্থ এটি যদি ডাটাবেস থেকে আসে তবে এটি আরও ধীর হতে পারে)।

খ।) একটি উপায় আছে, আপনাকে কেবল cache()সঠিক জায়গায় যেতে হবে:

mappedRdd = rddIn.map(lambda x: customMapper(x)).cache()
rdd0 = mappedRdd.filter(lambda x: x[0]==0)
rdd1 = mappedRdd.filter(lambda x: x[0]==1)

এটি করে, আমরা স্পার্ককে বলছি যে এটি আংশিক ফলাফলগুলি সংরক্ষণ করতে পারে mappedRdd; এটি তখন rdd1এবং উভয় ক্ষেত্রেই এই আংশিক ফলাফলগুলি ব্যবহার করবে rdd2। স্পার্ক দৃষ্টিকোণ থেকে এটি সমান:

mappedRdd = rddIn.map(lambda x: customMapper(x)).saveAsObjectFile('..')
# forget about everything
rdd0 = sc.objectFile('..').filter(lambda x: x[0]==0)
rdd1 = sc.objectFile('..').filter(lambda x: x[0]==1)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.