কিভাবে স্পার্কে আউটপুট ডিরেক্টরি ওভাররাইট করা যায়


107

আমার কাছে একটি স্পার্ক স্ট্রিমিং অ্যাপ্লিকেশন রয়েছে যা প্রতি মিনিটের জন্য একটি ডেটাसेट তৈরি করে। প্রক্রিয়াজাত ডেটার ফলাফলগুলিকে আমার সংরক্ষণ / ওভাররাইট করতে হবে।

আমি যখন ডেটাসেট org.apache.hadoop.mapred.FileAlreadyExistsException ডেটাসেট ওভাররাইট করার চেষ্টা করেছি তখন এক্সিকিউশনটি থামিয়ে দেয়।

আমি স্পার্ক সম্পত্তি সেট set("spark.files.overwrite","true"), কিন্তু কোন ভাগ্য নেই।

কিভাবে ওভাররাইট বা স্পার্ক থেকে ফাইলগুলি প্রিডিলেট করবেন?


1
হ্যাঁ এটি সফল হয় না, আমি এটি 0.9.0 এ একটি রিগ্রেশন হিসাবে বিবেচনা করি। দয়া করে আমার উত্তরটি মেনে নিন :)
সমবেত

set("spark.files.overwrite","true")যোগ এর মধ্য দিয়ে ফাইল কেবল কাজ করেspark.addFile()
Aiman

উত্তর:


106

আপডেট: ব্যবহারের Dataframesমতো আরও কিছু প্রস্তাব করুন ... .write.mode(SaveMode.Overwrite) ...

হ্যান্ড পিম্প:

implicit class PimpedStringRDD(rdd: RDD[String]) {
    def write(p: String)(implicit ss: SparkSession): Unit = {
      import ss.implicits._
      rdd.toDF().as[String].write.mode(SaveMode.Overwrite).text(p)
    }
  }

পুরানো সংস্করণ চেষ্টা করুন

yourSparkConf.set("spark.hadoop.validateOutputSpecs", "false")
val sc = SparkContext(yourSparkConf)

1.1.0 এ আপনি --conf পতাকা সহ স্পার্ক-জমা স্ক্রিপ্ট ব্যবহার করে কনফিড সেটিংস সেট করতে পারেন।

সতর্কতা (পুরানো সংস্করণ): @ পিগজিবক্স অনুসারে স্পার্কে একটি বাগ রয়েছে যেখানে এটি কেবল ফাইলগুলিকে লিখতে হবে এমন part-ফাইলগুলিকে ওভাররাইট করবে , অন্য কোনও ফাইল খালি ছেড়ে দেওয়া হবে।


29
এর জন্য Spark 1.4:df.write.mode(SaveMode.Overwrite).parquet(path)
হা ফাম

স্পার্ক এসকিউএল-এর জন্য আপনার কাছে কোর স্পার্কের জন্য সেভমোড সংজ্ঞায়িত করার বিকল্প রয়েছে আপনার কাছে এর মতো কিছু নেই। এসটেক্সটফিল এবং অন্যান্য রূপান্তরগুলির জন্য সে জাতীয় বৈশিষ্ট্যটি সত্যিই পছন্দ করতে চান
মুর্তজা কাঁচওয়ালা

3
একটি লুকানো সমস্যা: এইচডিএফএসের মাধ্যমে পুরো ফোল্ডারটি মুছে ফেলার জন্য @ পিজেসিভিকের সমাধানটির সাথে তুলনা করা, এই পদ্ধতির মধ্যে স্পার্ক কেবল আউটপুট ফোল্ডারে একই ফাইলের নামের অংশের ফাইলগুলি ওভাররাইট করবে। এটি বেশিরভাগ সময় কাজ করে, তবে ফোল্ডারে অন্য স্পার্ক / হ্যাডোপ কাজ থেকে অতিরিক্ত কিছু ফাইল যেমন এই ফাইলগুলি ওভাররাইট করে না।
পিগিগবক্স

6
আপনি df.write.mode(mode: String).parquet(path)যেখানে যেখানে মোড ব্যবহার করতে পারেন : স্ট্রিংটি হতে পারে: "ওভাররাইট", "সংযোজন", "উপেক্ষা", "ত্রুটি"।
রাই

1
@ ওয়াওক্যাডো ইয়ুপ তাই মনে করেন, স্পার্ক এপিআইগুলি প্রতিটি প্রকাশের ক্ষেত্রে আরও খারাপ এবং খারাপ হয়: পি
সাম্যাথেবেস্ট

41

যেহেতু df.save(path, source, mode)নিন্দা করা হয়েছে, ( http://spark.apache.org/docs/1.5.0/api/scala/index.html#org.apache.spark.sql.DataFrame )

ব্যবহার df.write.format(source).mode("overwrite").save(path)
যেখানে df.write DataFrameWriter হয়

'উত্স' হতে পারে ("com.databricks.spark.avro" | "parquet" | "json")


1
sourceএছাড়াও হতে পারেcsv
রোমান ২

V2.4.3 এ কাজ করে
jmng

27

প্যারামিটারের জন্য ডকুমেন্টেশন এটি spark.files.overwriteবলে: " SparkContext.addFile()লক্ষ্য ফাইল উপস্থিত থাকলে এবং এর বিষয়বস্তু উত্সগুলির সাথে মেলে না তার মাধ্যমে যুক্ত ফাইলগুলি ওভাররাইট করা হবে কিনা" Whether সুতরাং saveAsTextFiles পদ্ধতিতে এর কোনও প্রভাব নেই।

আপনি ফাইলটি সংরক্ষণের আগে এটি করতে পারেন:

val hadoopConf = new org.apache.hadoop.conf.Configuration()
val hdfs = org.apache.hadoop.fs.FileSystem.get(new java.net.URI("hdfs://localhost:9000"), hadoopConf)
try { hdfs.delete(new org.apache.hadoop.fs.Path(filepath), true) } catch { case _ : Throwable => { } }

আস এখানে ব্যাখ্যা করেছেন: http://apache-spark-user-list.1001560.n3.nabble.com/How-can-I-make-Spark-1-0-saveAsTextFile-to-overwrite-existing-file-td6696। এইচটিএমএল


29
পিসপার্ক সম্পর্কে কি?
জাভাদবা

'Writ.mode (SaveMode.Overwrit)' ব্যবহারের পরবর্তী উত্তরটি যাওয়ার উপায়
YaOg

এইচডিএফএসগুলি নতুন ফাইলগুলি আসার সাথে সাথে মুছে ফেলতে পারে কারণ এটি এখনও পুরানো ফাইলগুলি মুছে ফেলছে।
জেক

25

থেকে pyspark.sql.DataFrame.save ডকুমেন্টেশন (বর্তমানে 1.3.1 এ), আপনি নির্দিষ্ট করতে পারেন mode='overwrite'যখন একটি DataFrame সংরক্ষণ:

myDataFrame.save(path='myPath', source='parquet', mode='overwrite')

আমি যাচাই করেছি যে এটি এমনকি পার্টিশন ফাইলগুলি বাম থেকে সরিয়ে ফেলবে। সুতরাং আপনি যদি 10 টি পার্টিশন / ফাইলগুলি মূলত বলে থাকেন তবে তারপরে ফোল্ডারটি এমন একটি ডেটাফ্রেমে ওভাররোট করুন যেখানে কেবল 6 টি পার্টিশন রয়েছে, ফলস্বরূপ ফোল্ডারে 6 টি পার্টিশন / ফাইল থাকবে।

দেখুন স্পার্ক এসকিউএল ডকুমেন্টেশন মোড বিকল্পের বিষয়ে আরও তথ্যের জন্য।


2
সত্য এবং সহায়ক, ধন্যবাদ, তবে একটি ডেটা ফ্রেমের নির্দিষ্ট সমাধান - spark.hadoop.validateOutputSpecsসমস্ত স্পার্ক এপিআইতে কাজ করবে।
সামথবেস্ট

কোনও কারণে, spark.hadoop.validateOutputSpecsআমার জন্য 1.3-তে কাজ করেনি, তবে এটি করে।
এরিক ওয়াকার 23

1
@ সাম্তেবেস্ট save(... , mode=রুটটি সহ, আপনি একই স্পার্ক প্রসঙ্গে একটি ফাইলের সেটকে ওভাররাইট করতে পারেন, অন্যকে সংযুক্ত করতে পারেন। spark.hadoop.validateOutputSpecsআপনাকে প্রসঙ্গ অনুসারে কেবল একটি মোডে সীমাবদ্ধ রাখবেন না ?
dnlbrky

1
@dnlbrky ওপিকে সংযোজন করতে বলেনি। যেমনটি আমি বলেছি, সত্য, দরকারী তবে অপ্রয়োজনীয়। যদি ওপি "আমি কীভাবে সংযোজন করব" জিজ্ঞাসা করে তবে পুরো পরিসরের উত্তর দেওয়া যেতে পারে। তবে এর মধ্যে যাওয়া যাক না। এছাড়াও আমি আপনাকে পরামর্শ দিচ্ছি যে ডেটা ফ্রেমগুলির স্কাল সংস্করণটি ব্যবহারের বিষয়ে বিবেচনা করার জন্য এটির টাইপ সুরক্ষা এবং আরও চেকিং রয়েছে - উদাহরণস্বরূপ, "ওভাররাইট" এ আপনার টাইপ থাকলে ড্যাগের মূল্যায়ন না হওয়া পর্যন্ত আপনি খুঁজে পেতেন না - যা কোনও বিগ ডেটা কাজের ক্ষেত্রে পারে 2 ঘন্টা পরে !! আপনি যদি স্কালা সংস্করণটি ব্যবহার করেন তবে সংকলকটি সামনে সবকিছু যাচাই করবে! খুব সুন্দর এবং বড় ডেটার জন্য খুব গুরুত্বপূর্ণ।
সামতিবেস্ট

15

df.write.mode('overwrite').parquet("/output/folder/path")অজগর ব্যবহার করে যদি আপনি একটি parquet ফাইল ওভাররাইট করতে চান তবে কাজ করে। এটি স্পার্কে রয়েছে 1.6.2। পরবর্তী সংস্করণগুলিতে এপিআই আলাদা হতে পারে


হ্যাঁ এটি আমার প্রয়োজনীয়তার জন্য দুর্দান্ত কাজ করে (ডেটাব্রিক্স)
নিক.এমসিডার্মিডেড

4
  val jobName = "WordCount";
  //overwrite the output directory in spark  set("spark.hadoop.validateOutputSpecs", "false")
  val conf = new 
  SparkConf().setAppName(jobName).set("spark.hadoop.validateOutputSpecs", "false");
  val sc = new SparkContext(conf)

শুধুমাত্র স্পার্ক 1 এর জন্য, সর্বশেষ সংস্করণ ব্যবহারের জন্যdf.write.mode(SaveMode.Overwrite)
চিকুমিকু

3

সেভ ফাংশনের এই ওভারলোড হওয়া সংস্করণটি আমার জন্য কাজ করে:

yourDF.save (আউটপুটপথ, org.apache.spark.sql.SaveMode.valueOf ("ওভাররাইট"))

উপরের উদাহরণটি একটি বিদ্যমান ফোল্ডারটি ওভাররাইট করবে। সেভমোড এই প্যারামিটারগুলিও নিতে পারে ( https://spark.apache.org/docs/1.4.0/api/java/org/apache/spark/sql/SaveMode.html ):

পরিশেষে : append মুডে মানে যখন একটি ডাটা উৎস থেকে একটি DataFrame সংরক্ষণ, যদি ডেটা / টেবিল আগে থেকেই আছে, DataFrame বিষয়বস্তু বিদ্যমান ডেটাতে যোগ করা হবে বলে আশা করা হয় যে।

ত্রুটিআইফ্যাক্সজিস্টস : ত্রুটিআইফেক্সিস্ট মোডের অর্থ হ'ল কোনও ডেটা উত্সে ডেটাফ্রেম সংরক্ষণ করার সময়, যদি ডেটা ইতিমধ্যে বিদ্যমান থাকে, তবে একটি ব্যতিক্রম ছুঁড়ে ফেলা আশা করা যায়।

উপেক্ষা করুন : মোড উপেক্ষা করুন এর অর্থ হ'ল কোনও ডেটা উত্সে ডেটা ফ্রেম সংরক্ষণ করার সময়, যদি ডেটা ইতিমধ্যে বিদ্যমান থাকে, সেভ অপারেশনটি ডেটাফ্রেমের বিষয়বস্তুগুলি সংরক্ষণ না করে এবং বিদ্যমান ডেটা পরিবর্তন না করার প্রত্যাশা করে।


1

আপনি যদি নিজের কাস্টম আউটপুট ফর্ম্যাটটি ব্যবহার করতে ইচ্ছুক হন তবে আপনি আরডিডি দিয়েও পছন্দসই আচরণ পেতে সক্ষম হবেন।

নিম্নলিখিত ক্লাসগুলি দেখুন: ফাইলআউটপুট ফোর্ম্যাট , ফাইলআউটপুটকমিটর

ফাইল আউটপুট ফর্ম্যাটে আপনার কাছে চেকআউটপুটস্পেস নামে একটি পদ্ধতি রয়েছে, যা আউটপুট ডিরেক্টরি উপস্থিত কিনা তা যাচাই করে। ফাইলআউটপুট কমমিটারে আপনার কাছে কমিটজব রয়েছে যা সাধারণত অস্থায়ী ডিরেক্টরি থেকে চূড়ান্ত স্থানে ডেটা স্থানান্তর করে।

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

আউটপুট ফর্ম্যাটটি এতে পাস করা হয়েছে: saveAsNewAPIHadoopFile (যা আসলে সেইভস টেক্সটফিল পদ্ধতি হিসাবে ফাইলগুলি সংরক্ষণ করার জন্য বলা হয়)। এবং আউটপুট কমিটর অ্যাপ্লিকেশন স্তরে কনফিগার করা হয়।


আপনি যদি সহায়তা করতে পারেন তবে আমি ফাইলআউটপুটকমিটরের সাবক্লাসিংয়ের কাছে যাওয়া এড়াতে পারব: এটি কোডের একটি ভীতিকর বিষয়। হ্যাডোপ 3.0.০ একটি প্লাগইন পয়েন্ট যুক্ত করেছে যেখানে ফাইলআউটপুট ফর্ম্যাট একটি রিফ্যাক্টরড সুপারক্লাসের পৃথক বাস্তবায়ন নিতে পারে (প্যাথআউটপুটকমিটর)। নেটফ্লিক্সের এস 3 জন একটি বিভাজনযুক্ত গাছে লিখবেন, কেবল বিরোধের সমাধান করবেন (ব্যর্থ, মুছুন, যোগ করুন) এবং কেবলমাত্র নতুন পার্টিশনে
স্টিভেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.