আরডিডির বিষয়বস্তু কীভাবে প্রিন্ট করা যায়?


124

আমি সংগ্রহের সামগ্রীগুলি স্পার্ক কনসোলে মুদ্রণের চেষ্টা করছি।

আমার এক প্রকার আছে:

linesWithSessionId: org.apache.spark.rdd.RDD[String] = FilteredRDD[3]

এবং আমি আদেশটি ব্যবহার করি:

scala> linesWithSessionId.map(line => println(line))

তবে এটি মুদ্রিত:

res1: org.apache.spark.rdd.RDD [ইউনিট] = ম্যাপ করাআরডিডি [4] মানচিত্রে: 19

আমি কীভাবে কনসোল করতে আরডিডি লিখতে বা ডিস্কে এটি সংরক্ষণ করতে পারি যাতে আমি এর সামগ্রীগুলি দেখতে পারি?


1
ওহে! আপনি নিজের দ্বারা গৃহীত উত্তরের মন্তব্যগুলি পড়েছেন? এটি বিভ্রান্তিকর বলে মনে হচ্ছে
dk14

2
@ ডেকে 14 রাজি হয়ে গেছে, আমি স্বীকৃত উত্তর পুনর্নির্দিষ্ট করেছি
নীল-আকাশ

আরডিডি দ্বিতীয় শ্রেণির নাগরিক হিসাবে প্রকাশিত হচ্ছে, আপনার ডেটাফ্রেম এবং showপদ্ধতিটি ব্যবহার করা উচিত ।
থমাস ডেকাউক্স

উত্তর:


235

আপনি যদি আরডিডির সামগ্রী দেখতে চান তবে একটি উপায় হ'ল collect():

myRDD.collect().foreach(println)

যদিও এটি আরডিডিটির কোটি কোটি লাইন রয়েছে, এটি কোনও ভাল ধারণা নয়। take()মুদ্রণের জন্য মাত্র কয়েকটি নেওয়ার জন্য ব্যবহার করুন :

myRDD.take(n).foreach(println)

1
যদি আমি এইচডিএফএসে লিখিত সামগ্রীটি একক ফাইল হিসাবে লিখতে আরডিডি (যার লক্ষ লক্ষ লাইন রয়েছে) উপর পূর্বাচ ব্যবহার করি তবে এটি কি গুচ্ছের কোনও সমস্যা ছাড়াই কাজ করবে?
শঙ্কর

যে কারণে আমি saveAsTextFileআরডিডি ব্যবহার করছি না তা হ'ল, আমাকে আরডিডি বিষয়বস্তু একাধিক ফাইলে লিখতে হবে, এজন্য আমি ব্যবহার করছিforeach
শঙ্কর

আপনি যদি একটি একক ফাইলে সংরক্ষণ করতে চান তবে saveAsTextFile কল করার আগে আপনি আরডিডি একটি পার্টিশনে একত্রিত করতে পারেন, তবে আবার এটি সমস্যার কারণ হতে পারে। আমি মনে করি সেরা বিকল্পটি এইচডিএফএসে একাধিক ফাইলে লিখতে হবে, তারপরে এইচডিএফএস ডিএফএস ব্যবহার করুন
ওসামা

আপনি বলেছিলেন যে কোনও আরডিডি তে পূর্বাচ ব্যবহার করার পরে এটি চালকের র‌্যামে অবিরত থাকবে, বিবৃতিটি কি সঠিক? কারণ আমি যা বুঝতে পেরেছি তা চালকের উপর নয় প্রতিটি কর্মী [ক্লাস্টার] এ চলবে।
শঙ্কর

saveAsTextFile পার্টিশন প্রতি একটি ফাইল লিখবে, যা আপনি চান (একাধিক ফাইল)। অন্যথায় ওসামার পরামর্শ অনুসারে, আপনি একটি ফাইল পেতে rdd.coalesce (1) .SaveAsTextFile () করতে পারেন। RDD আপনার পছন্দ অনুসারে জন্য খুব অল্প পার্টিশন থাকে, তাহলে আপনি rdd.repartition চেষ্টা করে দেখতে পারেন (এন) .saveAsTextFile ()
সাইরেন

49

mapফাংশন একটি হল রূপান্তর , যা স্পার্ক আসলে আপনার RDD মূল্যায়ন করা হবে না মানে যতক্ষণ না আপনি একটি চালানোর কর্ম এটিতে।

এটি মুদ্রণ করতে, আপনি foreach(যা একটি ক্রিয়া) ব্যবহার করতে পারেন :

linesWithSessionId.foreach(println)

এটিকে ডিস্কে লিখতে আপনি আরডিডি এপিআইsaveAs... থেকে ফাংশনগুলির একটি (এখনও ক্রিয়া) ব্যবহার করতে পারেন


6
হয়তো আপনার উল্লেখ collectকরতে হবে যাতে কনসোলে আরডিডি মুদ্রণ করা যায়।
zsxwing

1
foreachনিজেই প্রথমে আরডিডিটিকে "রূপায়ণ" করবে এবং তারপরে printlnপ্রতিটি উপাদানকে চালিত করবে, সুতরাং collectএখানে সত্যিকারের প্রয়োজন নেই (যদিও আপনি এটি অবশ্যই ব্যবহার করতে পারেন) ...
ফেড্রাগন

5
আসলে সংগ্রহ () ব্যতীত, পূর্বাভাসের আগে, আমি কনসোলে কিছু দেখতে পাচ্ছি না।
ভিটোরিও কোজোলিনো

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

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

12

আপনি যদি এটি কোনও ক্লাস্টারে চালাচ্ছেন তবে printlnআপনার প্রসঙ্গে আর মুদ্রণ করবেন না। RDDআপনার সেশনে আপনাকে ডেটা আনতে হবে। এটি করতে আপনি এটিকে স্থানীয় অ্যারেতে জোর করতে পারেন এবং তারপরে এটি মুদ্রণ করতে পারেন:

linesWithSessionId.toArray().foreach(line => println(line))

12

তুমি তোমার রূপান্তর করতে পারেন RDDএকটি থেকে DataFrameতারপর show()এটা।

// For implicit conversion from RDD to DataFrame
import spark.implicits._

fruits = sc.parallelize([("apple", 1), ("banana", 2), ("orange", 17)])

// convert to DF then show it
fruits.toDF().show()

এটি আপনার ডেটার শীর্ষ 20 লাইনগুলি দেখায় তাই আপনার ডেটার আকারটি কোনও সমস্যা হওয়া উচিত নয়।

+------+---+                                                                    
|    _1| _2|
+------+---+
| apple|  1|
|banana|  2|
|orange| 17|
+------+---+

1
আমি মনে করি এটি হ'লimport spark.implicits._
রায়ান হার্টম্যান

এখানে গ্রন্থাগারটি কী ব্যবহৃত হত? আমি সনাক্ত করতে পারে না তন্ন তন্ন toDFনা spark.implicits._স্ফুলিঙ্গ সুযোগ।
সেরগেই

1

এর মধ্যে myRDD.foreach(println)এবং সম্ভবত myRDD.collect().foreach(println)(কেবল 'সংগ্রহ' নয়, অন্যান্য ক্রিয়াগুলির মধ্যেও অনেকগুলি স্থাপত্যের পার্থক্য রয়েছে )। আমি যখন পার্থক্যগুলি দেখেছি তা হচ্ছে myRDD.foreach(println), আউটপুটটি এলোমেলো ক্রমে হবে। উদাহরণস্বরূপ: আমার আরডিডি যদি এমন কোনও পাঠ্য ফাইল থেকে আগত হয় যেখানে প্রতিটি লাইনের একটি সংখ্যা থাকে তবে আউটপুটটির আলাদা অর্ডার থাকে। কিন্তু যখন আমি করেছি myRDD.collect().foreach(println), অর্ডার ঠিক টেক্সট ফাইলের মতোই থাকে।



1
c.take(10)

এবং স্পার্কের নতুন সংস্করণটি টেবিলটি সুন্দরভাবে প্রদর্শন করবে।


1

প্রতিবার টাইপ করার পরিবর্তে, আপনি পারেন;

[1] স্পার্ক শেলের ভিতরে একটি জেনেরিক মুদ্রণ পদ্ধতি তৈরি করুন।

def p(rdd: org.apache.spark.rdd.RDD[_]) = rdd.foreach(println)

[2] বা আরও ভাল, ছদ্মবেশ ব্যবহার করে আপনি এর বিষয়বস্তু মুদ্রণের জন্য ফাংশনটি আরডিডি শ্রেণিতে যুক্ত করতে পারেন।

implicit class Printer(rdd: org.apache.spark.rdd.RDD[_]) {
    def print = rdd.foreach(println)
}

ব্যবহারের উদাহরণ:

val rdd = sc.parallelize(List(1,2,3,4)).map(_*2)

p(rdd) // 1
rdd.print // 2

আউটপুট:

2
6
4
8

গুরুত্বপূর্ণ

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



আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.