স্পার্ক: ইউডিএফ বহুবার কার্যকর করা হয়েছিল


9

নিম্নলিখিত কোড সহ আমার একটি ডেটাফ্রেম রয়েছে:

def test(lat: Double, lon: Double) = {
  println(s"testing ${lat / lon}")
  Map("one" -> "one", "two" -> "two")
}

val testUDF = udf(test _)

df.withColumn("test", testUDF(col("lat"), col("lon")))
  .withColumn("test1", col("test.one"))
  .withColumn("test2", col("test.two"))

এখন লগগুলি পরীক্ষা করে, আমি জানতে পেরেছি যে প্রতিটি সারির জন্য ইউডিএফ 3 বার কার্যকর করা হয়। যদি আমি একটি "টেস্ট.থ্রি" কলাম থেকে "টেস্ট3" যুক্ত করি তবে ইউডিএফ আরও একবার কার্যকর করা হবে।

কেউ আমাকে ব্যাখ্যা করতে পারেন কেন?

এটিকে কী সঠিকভাবে এড়ানো যায় ("টেস্ট" যুক্ত হওয়ার পরে ডেটাফ্রেমকে ক্যাচ না করে, এটি কাজ করলেও)?


আপনি কি বোঝাতে চেয়েছেন? আপনি তিনবার পরীক্ষা ফাংশন কল করছেন। এ কারণেই এটি তিনবার কার্যকর করা হচ্ছে। আপনি কেন এটি ইউডিএফ বানাচ্ছেন তা নিশ্চিত নন। কেন শুধু মানচিত্রকে ভাল করে তুলবেন না?
ব্যবহারকারী4601931

এটি স্পার্কের আচরণ দেখানোর উদাহরণ মাত্র। আমার জন্য "পরীক্ষা" একটি নতুন কলাম যা একটি কাঠামো ধারণ করে, তবে কাঠামোর কোনও অংশ অ্যাক্সেস করা আবার ইউডিএফ চালানো উচিত নয়। আমি কীভাবে ভুল?
রোলিন্টোকোর

আমি স্কিমাটি প্রিন্ট করার চেষ্টা করেছি, "টেস্ট" এর Mapডেটাটাইপ স্ট্রাক্ট নয়। এখন মানচিত্র ফিরিয়ে দেওয়ার পরিবর্তে, যদি ইউডিএফ টেস্টের মতো কেস ক্লাস দেয় (একটি স্ট্রিং, দুটি: স্ট্রিং) তবে testএটি অবশ্যই স্ট্রাক্ট তবে ইউডিএফের যতটা মৃত্যুদণ্ড কার্যকর থাকে তা সর্বদা থাকে।
রোলিন্টোকোর


এই উত্তরটি অনুসারে ক্যাচিংয়ের
রাফেল রোথ

উত্তর:


5

আপনি যদি কোনও ইউডিএফ-তে একাধিক কল এড়াতে চান (যা ইউডিএফ আপনার কাজের ক্ষেত্রে বাধা হয়ে থাকে বিশেষত যদি কার্যকর হয়) তবে আপনি নিম্নলিখিত হিসাবে এটি করতে পারেন:

val testUDF = udf(test _).asNondeterministic()

মূলত আপনি স্পার্ককে বলুন যে আপনার ক্রিয়াকলাপটি ডিটারমিনিস্টিক নয় এবং এখন স্পার্ক নিশ্চিত করে যে এটি কেবল একবার বলা হয়েছিল কারণ এটি একাধিকবার কল করা নিরাপদ নয় (প্রতিটি কল সম্ভবত ভিন্ন ফলাফল ফিরে আসতে পারে)।

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


চমৎকার! এই উত্তরটি এখানেও অন্তর্ভুক্ত: stackoverflow.com/questions/40320563/…
রাফেল রোথ

আমার ক্ষেত্রে, asNondeterministicইউডিএফকে কেবল একবার কার্যকর করতে বাধ্য করে। সঙ্গে explode(array(myUdf($"id")))সমাধান, এটি এখনও দুইবার মৃত্যুদন্ড কার্যকর করা হয়।
রোলিন্টোকোর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.