কেউ আমাকে মানচিত্র এবং ফ্ল্যাটম্যাপের মধ্যে পার্থক্য ব্যাখ্যা করতে পারেন এবং প্রত্যেকের জন্য ভাল ব্যবহারের ক্ষেত্রে কী?
"ফলাফল সমতল" এর অর্থ কী? এটা কি জন্য ভাল?
কেউ আমাকে মানচিত্র এবং ফ্ল্যাটম্যাপের মধ্যে পার্থক্য ব্যাখ্যা করতে পারেন এবং প্রত্যেকের জন্য ভাল ব্যবহারের ক্ষেত্রে কী?
"ফলাফল সমতল" এর অর্থ কী? এটা কি জন্য ভাল?
উত্তর:
এখানে পার্থক্যটির একটি উদাহরণ, একটি spark-shell
অধিবেশন হিসাবে :
প্রথমত, কিছু তথ্য - পাঠ্যের দুটি লাইন:
val rdd = sc.parallelize(Seq("Roses are red", "Violets are blue")) // lines
rdd.collect
res0: Array[String] = Array("Roses are red", "Violets are blue")
এখন, map
দৈর্ঘ্যের N এর একটি আরডিডিকে দৈর্ঘ্যের N এর আরডিডি রূপান্তর করে
উদাহরণস্বরূপ, এটি দুটি লাইন থেকে দুটি লাইন দৈর্ঘ্যে মানচিত্র করে:
rdd.map(_.length).collect
res1: Array[Int] = Array(13, 16)
তবে flatMap
(আলগাভাবে বলতে) দৈর্ঘ্যের N এর একটি আরডিডিকে N সংগ্রহের সংকলনে রূপান্তরিত করে, তারপরে এগুলি ফলাফলের একক আরডিডি রূপান্তর করে।
rdd.flatMap(_.split(" ")).collect
res2: Array[String] = Array("Roses", "are", "red", "Violets", "are", "blue")
আমাদের প্রতি লাইন একাধিক শব্দ এবং একাধিক লাইন রয়েছে তবে আমরা শব্দের একক আউটপুট অ্যারে দিয়ে শেষ করি
কেবল এটি চিত্রিত করার জন্য, ফ্ল্যাটম্যাপিং লাইনের সংকলন থেকে শব্দের সংকলনের মতো দেখাচ্ছে:
["aa bb cc", "", "dd"] => [["aa","bb","cc"],[],["dd"]] => ["aa","bb","cc","dd"]
ইনপুট এবং আউটপুট আরডিডি সাধারণত তাই বিভিন্ন আকারের হবে flatMap
।
যদি আমরা map
আমাদের split
ফাংশনটি ব্যবহার করার চেষ্টা করে থাকি তবে আমরা নেস্টেড স্ট্রাকচারগুলি (শব্দের অ্যারেগুলির একটি আরডিডি, টাইপ সহ RDD[Array[String]]
) দিয়ে শেষ করতাম কারণ প্রতি ইনপুটটিতে আমাদের ঠিক এক ফলাফল থাকতে হবে:
rdd.map(_.split(" ")).collect
res3: Array[Array[String]] = Array(
Array(Roses, are, red),
Array(Violets, are, blue)
)
শেষ অবধি, একটি দরকারী বিশেষ কেস একটি ফাংশন সহ ম্যাপিং যা সম্ভবত কোনও উত্তর না ফেরায় এবং তাই একটি প্রদান করে Option
। flatMap
যে উপাদানগুলি প্রত্যাবর্তন করে None
তাদের কাছ থেকে মানগুলি বের করে এবং নিষ্কাশন করতে আমরা ফিল্টারগুলি ব্যবহার করতে পারি Some
:
val rdd = sc.parallelize(Seq(1,2,3,4))
def myfn(x: Int): Option[Int] = if (x <= 2) Some(x * 10) else None
rdd.flatMap(myfn).collect
res3: Array[Int] = Array(10,20)
(এখানে লক্ষণীয় যে একটি বিকল্প তালিকার মতো আচরণ করে যার মধ্যে একটি উপাদান বা শূন্য উপাদান রয়েছে)
["a b c", "", "d"] => [["a","b","c"],[],["d"]]
?
split
স্ট্রিংসের তালিকার উপরে ম্যাপিংটি অ্যারেগুলির তালিকা তৈরি করবে)
সাধারণত আমরা হ্যাডুপে শব্দ গণনা উদাহরণ ব্যবহার করি। আমি একই ব্যবহারের ক্ষেত্রে নেব এবং ব্যবহার করব map
এবং flatMap
এটি কীভাবে ডেটা প্রক্রিয়াকরণ করছে তা আমরা দেখতে পাব।
নীচে নমুনা ডেটা ফাইল রয়েছে।
hadoop is fast
hive is sql on hdfs
spark is superfast
spark is awesome
উপরের ফাইলটি map
এবং ব্যবহার করে পার্স করা হবে flatMap
।
map
>>> wc = data.map(lambda line:line.split(" "));
>>> wc.collect()
[u'hadoop is fast', u'hive is sql on hdfs', u'spark is superfast', u'spark is awesome']
ইনপুটটিতে 4 টি লাইন রয়েছে এবং আউটপুট আকার 4 টিও হয়, যেমন এন উপাদানগুলি ==> এন উপাদানগুলি।
flatMap
>>> fm = data.flatMap(lambda line:line.split(" "));
>>> fm.collect()
[u'hadoop', u'is', u'fast', u'hive', u'is', u'sql', u'on', u'hdfs', u'spark', u'is', u'superfast', u'spark', u'is', u'awesome']
আউটপুট মানচিত্র থেকে পৃথক।
শব্দের সংখ্যাটি পেতে প্রতিটি কীটির মান হিসাবে 1 নির্ধারণ করি।
fm
: আরডিডি ব্যবহার করে তৈরি করা হয়েছে flatMap
wc
: আরডিডি ব্যবহার করে তৈরি করা হয়েছে map
>>> fm.map(lambda word : (word,1)).collect()
[(u'hadoop', 1), (u'is', 1), (u'fast', 1), (u'hive', 1), (u'is', 1), (u'sql', 1), (u'on', 1), (u'hdfs', 1), (u'spark', 1), (u'is', 1), (u'superfast', 1), (u'spark', 1), (u'is', 1), (u'awesome', 1)]
আরডিডি- flatMap
তে wc
নীচে অনাকাঙ্ক্ষিত আউটপুট দেবে:
>>> wc.flatMap(lambda word : (word,1)).collect()
[[u'hadoop', u'is', u'fast'], 1, [u'hive', u'is', u'sql', u'on', u'hdfs'], 1, [u'spark', u'is', u'superfast'], 1, [u'spark', u'is', u'awesome'], 1]
map
পরিবর্তে ব্যবহৃত হলে আপনি গণনা শব্দটি পেতে পারেন না flatMap
।
সংজ্ঞা অনুসারে map
এবং এর মধ্যে পার্থক্য flatMap
:
map
: এটি আরডিডির প্রতিটি উপাদানগুলিতে প্রদত্ত ফাংশন প্রয়োগ করে একটি নতুন আরডিডি প্রদান করে।map
শুধুমাত্র একটি আইটেম ফাংশন ফাংশন ।
flatMap
: এর অনুরূপmap
, এটি আরডিডির প্রতিটি উপাদানগুলিতে একটি ফাংশন প্রয়োগ করে একটি নতুন আরডিডি দেয়, তবে আউটপুট সমতল হয়।
.map(lambda line:line.split(" "))
স্ট্রিংগুলির একটি অ্যারে নয়। আপনার পরিবর্তন data.collect()
করা উচিত wc.collect
এবং আপনি অ্যারেগুলির একটি অ্যারে দেখতে পাবেন।
wc.collect()
?
আপনি যদি স্পার্কে আরডিডি.ম্যাপ এবং আরডিডি.ফ্ল্যাটম্যাপের মধ্যে পার্থক্য জিজ্ঞাসা করছেন, মানচিত্র একটি আকারের আরডিডি আকারের অন্য একটিতে রূপান্তর করে। যেমন।
myRDD.map(x => x*2)
উদাহরণস্বরূপ, যদি মাইআরডিডি ডাবলসের সমন্বয়ে গঠিত।
যদিও ফ্ল্যাটম্যাপ আরডিডিটিকে একটি ভিন্ন আকারের একের মধ্যে রূপান্তর করতে পারে: যেমন:
myRDD.flatMap(x =>new Seq(2*x,3*x))
যা আকার 2 * এন বা একটি আরডিডি প্রদান করবে
myRDD.flatMap(x =>if x<10 new Seq(2*x,3*x) else new Seq(x) )
এটি আপনার প্রাথমিক প্রশ্নে ফুটে উঠেছে : চাটুকার বলতে কী বোঝ ?
আপনি যখন ফ্ল্যাটম্যাপ ব্যবহার করেন, একটি "বহুমাত্রিক" সংগ্রহটি "এক-মাত্রিক" সংগ্রহ হয়ে যায় ।
val array1d = Array ("1,2,3", "4,5,6", "7,8,9")
//array1d is an array of strings
val array2d = array1d.map(x => x.split(","))
//array2d will be : Array( Array(1,2,3), Array(4,5,6), Array(7,8,9) )
val flatArray = array1d.flatMap(x => x.split(","))
//flatArray will be : Array (1,2,3,4,5,6,7,8,9)
আপনি যখন ফ্ল্যাটম্যাপ ব্যবহার করতে চান,
test.md
উদাহরণ হিসাবে ব্যবহার করুন :
➜ spark-1.6.1 cat test.md
This is the first line;
This is the second line;
This is the last line.
scala> val textFile = sc.textFile("test.md")
scala> textFile.map(line => line.split(" ")).count()
res2: Long = 3
scala> textFile.flatMap(line => line.split(" ")).count()
res3: Long = 15
scala> textFile.map(line => line.split(" ")).collect()
res0: Array[Array[String]] = Array(Array(This, is, the, first, line;), Array(This, is, the, second, line;), Array(This, is, the, last, line.))
scala> textFile.flatMap(line => line.split(" ")).collect()
res1: Array[String] = Array(This, is, the, first, line;, This, is, the, second, line;, This, is, the, last, line.)
আপনি ব্যবহার করেন তাহলে map
পদ্ধতি, আপনি লাইনের পাবেন test.md
, জন্য flatMap
পদ্ধতি, আপনি শব্দের সংখ্যা পাবেন।
map
পদ্ধতি অনুরূপ flatMap
, সব তারা প্রত্যাবর্তন একটি নতুন RDD হয়। map
পদ্ধতিটি প্রায়শই একটি নতুন আরডিডি রিটার্ন ব্যবহার করার জন্য, flatMap
পদ্ধতিটি প্রায়শই বিভক্ত শব্দ ব্যবহার করে।
map
সমান সংখ্যক উপাদানের আরডিডি প্রদান করে যখন flatMap
নাও পারে।
flatMap
ফিল্টার আউট বা ভুল ডেটা ফিল্টার করার জন্য উদাহরণ ব্যবহার করুন।
map
ইনপুট এবং আউটপুট উপাদানগুলির সংখ্যা একই যেখানে বিস্তৃত ক্ষেত্রে ব্যবহারের জন্য উদাহরণ ব্যবহারের ক্ষেত্রে ।
number.csv
1
2
3
-
4
-
5
map.py অ্যাড.এসএসভিতে সমস্ত সংখ্যা যুক্ত করে।
from operator import *
def f(row):
try:
return float(row)
except Exception:
return 0
rdd = sc.textFile('a.csv').map(f)
print(rdd.count()) # 7
print(rdd.reduce(add)) # 15.0
ফ্ল্যাটম্যাপ.পি যোগflatMap
করার আগে নিখোঁজ ডেটা ফিল্টার আউট ব্যবহার করে। আগের সংস্করণের তুলনায় কম সংখ্যক যোগ করা হয়েছে।
from operator import *
def f(row):
try:
return [float(row)]
except Exception:
return []
rdd = sc.textFile('a.csv').flatMap(f)
print(rdd.count()) # 5
print(rdd.reduce(add)) # 15.0
মানচিত্র এবং ফ্ল্যাটম্যাপ অনুরূপ, অর্থে তারা ইনপুট আরডিডি থেকে একটি লাইন নিয়ে তাতে কোনও ফাংশন প্রয়োগ করে। তারা যেভাবে পৃথক হয় তা হ'ল মানচিত্রে ফাংশনটি কেবল একটি উপাদানকে ফেরত দেয়, যখন ফ্ল্যাটম্যাপে ফাংশন পুনরাবৃত্তকারী হিসাবে উপাদানগুলির (0 বা আরও বেশি) তালিকা ফিরিয়ে দিতে পারে।
এছাড়াও, ফ্ল্যাটম্যাপের আউটপুট সমতল হয়। যদিও ফ্ল্যাটম্যাপে ফাংশন উপাদানগুলির একটি তালিকা ফেরত দেয়, ফ্ল্যাটম্যাপটি একটি আরডিডি ফিরিয়ে দেয় যা তালিকা থেকে সমস্ত উপাদানকে সমতল উপায়ে (তালিকা নয়) দেয়।
সমস্ত উদাহরণ ভাল .... এখানে দুর্দান্ত দর্শন চিত্র ... উত্স সৌজন্যে: স্পার্কের ডেটাফ্লেয়ার প্রশিক্ষণ
মানচিত্র: একটি মানচিত্র অ্যাপাচি স্পার্কে একটি রূপান্তর অপারেশন। এটি আরডিডির প্রতিটি উপাদানগুলিতে প্রযোজ্য এবং ফলাফলটি নতুন আরডিডি হিসাবে দেয়। মানচিত্রে, অপারেশন বিকাশকারী তার নিজস্ব কাস্টম ব্যবসার যুক্তি সংজ্ঞায়িত করতে পারেন। আরডিডির সমস্ত উপাদানগুলিতে একই যুক্তি প্রয়োগ করা হবে।
স্পার্ক আরডিডি map
ফাংশনটি কাস্টম কোড (বিকাশকারী দ্বারা নির্দিষ্ট করা) অনুযায়ী ইনপুট প্রক্রিয়া হিসাবে একটি উপাদান নেয় এবং একসাথে একটি উপাদান ফেরত দেয়। মানচিত্র দৈর্ঘ্যের N এর একটি আরডিডি দৈর্ঘ্যের N এর অন্য আরডিডি রূপান্তর করে The ইনপুট এবং আউটপুট আরডিডিগুলিতে সাধারণত সমান সংখ্যক রেকর্ড থাকে।
map
স্কেল ব্যবহারের উদাহরণ :
val x = spark.sparkContext.parallelize(List("spark", "map", "example", "sample", "example"), 3)
val y = x.map(x => (x, 1))
y.collect
// res0: Array[(String, Int)] =
// Array((spark,1), (map,1), (example,1), (sample,1), (example,1))
// rdd y can be re writen with shorter syntax in scala as
val y = x.map((_, 1))
y.collect
// res1: Array[(String, Int)] =
// Array((spark,1), (map,1), (example,1), (sample,1), (example,1))
// Another example of making tuple with string and it's length
val y = x.map(x => (x, x.length))
y.collect
// res3: Array[(String, Int)] =
// Array((spark,5), (map,3), (example,7), (sample,6), (example,7))
সমতল মানচিত্র :
ক flatMap
একটি রূপান্তর অপারেশন। এটি আরডিডির প্রতিটি উপাদানগুলিতে প্রযোজ্য এবং ফলাফলটি নতুন হিসাবে ফিরিয়ে দেয় RDD
। এটি মানচিত্রের অনুরূপ, তবে ফ্ল্যাটম্যাপ মানচিত্রের কার্যকারিতা থেকে 0, 1 বা আরও বেশি উপাদান ফেরত দেয়। ফ্ল্যাটম্যাপ অপারেশনে, একজন বিকাশকারী তার নিজস্ব কাস্টম ব্যবসার যুক্তি সংজ্ঞায়িত করতে পারে। আরডিডির সমস্ত উপাদানগুলিতে একই যুক্তি প্রয়োগ করা হবে।
"ফলাফল সমতল" এর অর্থ কী?
একটি ফ্ল্যাটম্যাপ ফাংশন কাস্টম কোড অনুসারে এটি একটি উপাদান ইনপুট প্রক্রিয়া হিসাবে গ্রহণ করে (বিকাশকারী দ্বারা নির্দিষ্ট করা হয়) এবং একবারে 0 বা ততোধিক উপাদান ফেরত দেয়। flatMap
() দৈর্ঘ্য N এর একটি আরডিডি দৈর্ঘ্যের এম এর আরডিডি রূপান্তর করে
flatMap
স্কেল ব্যবহারের উদাহরণ :
val x = spark.sparkContext.parallelize(List("spark flatmap example", "sample example"), 2)
// map operation will return Array of Arrays in following case : check type of res0
val y = x.map(x => x.split(" ")) // split(" ") returns an array of words
y.collect
// res0: Array[Array[String]] =
// Array(Array(spark, flatmap, example), Array(sample, example))
// flatMap operation will return Array of words in following case : Check type of res1
val y = x.flatMap(x => x.split(" "))
y.collect
//res1: Array[String] =
// Array(spark, flatmap, example, sample, example)
// RDD y can be re written with shorter syntax in scala as
val y = x.flatMap(_.split(" "))
y.collect
//res2: Array[String] =
// Array(spark, flatmap, example, sample, example)
ফ্ল্যাটম্যাপ এবং মানচিত্র উভয়ই সংগ্রহকে রূপান্তরিত করে।
পার্থক্য:
মানচিত্র (ফানক)
ফাংশন ফানকের মাধ্যমে উত্সের প্রতিটি উপাদানকে পাস করে গঠিত নতুন বিতরণ করা ডেটাসেটটি ফিরিয়ে দিন।
ফ্ল্যাটম্যাপ (ফানক)
মানচিত্রের মতো, তবে প্রতিটি ইনপুট আইটেম 0 বা ততোধিক আউটপুট আইটেমগুলিতে ম্যাপ করা যায় (সুতরাং ফানকটি একটি আইটেমের পরিবর্তে একটি সিক ফিরিয়ে আনতে পারে)।
রূপান্তর ফাংশন:
মানচিত্র : একটি উপাদান -> একটি উপাদান আউট।
ফ্ল্যাটম্যাপ : একটি উপাদান -> 0 বা আরও বেশি উপাদান (সংগ্রহ) out
RDD.map
একক অ্যারেতে সমস্ত উপাদান প্রদান করে
RDD.flatMap
অ্যারের অ্যারেতে উপাদানগুলি প্রদান করে
আসুন ধরে নেওয়া যাক আমাদের পাঠ্য টেক্সট ফাইলটিতে পাঠ্য আছে
Spark is an expressive framework
This text is to understand map and faltMap functions of Spark RDD
মানচিত্র ব্যবহার করা
val text=sc.textFile("text.txt").map(_.split(" ")).collect
আউটপুট:
text: **Array[Array[String]]** = Array(Array(Spark, is, an, expressive, framework), Array(This, text, is, to, understand, map, and, faltMap, functions, of, Spark, RDD))
ফ্ল্যাটম্যাপ ব্যবহার করা হচ্ছে
val text=sc.textFile("text.txt").flatMap(_.split(" ")).collect
আউটপুট:
text: **Array[String]** = Array(Spark, is, an, expressive, framework, This, text, is, to, understand, map, and, faltMap, functions, of, Spark, RDD)
যারা পাইসপার্ক সম্পর্কিত চান তাদের সকলের জন্য:
উদাহরণ রূপান্তর: ফ্ল্যাটম্যাপ
>>> a="hello what are you doing"
>>> a.split()
['ওহে তুমি কি কর']
>>> b=["hello what are you doing","this is rak"]
>>> b.split()
ট্রেসব্যাক (সর্বশেষতম কল শেষ): ফাইল "", লাইন 1, এট্রিবিউটেরায়ার: "তালিকা" অবজেক্টটির কোনও বৈশিষ্ট্য নেই 'স্প্লিট'
>>> rline=sc.parallelize(b)
>>> type(rline)
>>> def fwords(x):
... return x.split()
>>> rword=rline.map(fwords)
>>> rword.collect()
[['হ্যালো', 'কি', 'তারা', 'আপনি', 'করছেন'], ['এটি', 'হ'ল', 'রাক']]
>>> rwordflat=rline.flatMap(fwords)
>>> rwordflat.collect()
['হ্যালো', 'কি', 'আপনি', 'আপনি', 'করছেন', 'এই', 'এটি', 'রাক']
আশা করি এটা সাহায্য করবে :)
map
: এটি এর RDD
প্রতিটি উপাদানটিতে একটি ফাংশন প্রয়োগ করে একটি নতুন ফেরত দেয় RDD
। .Map এ ফাংশনটি কেবলমাত্র একটি আইটেম ফিরে আসতে পারে।
flatMap
: মানচিত্রের অনুরূপ, এটি আরডিডির প্রতিটি উপাদানগুলিতে একটি ফাংশন প্রয়োগRDD
করে একটি নতুন ফেরত দেয় তবে আউটপুট সমতল হয়।
এছাড়াও, ফাংশনগুলি flatMap
উপাদানগুলির একটি তালিকা (0 বা আরও বেশি) ফিরিয়ে দিতে পারে
উদাহরণ স্বরূপ:
sc.parallelize([3,4,5]).map(lambda x: range(1,x)).collect()
আউটপুট: [[1, 2], [1, 2, 3], [1, 2, 3, 4]]
sc.parallelize([3,4,5]).flatMap(lambda x: range(1,x)).collect()
আউটপুট: নোটিশ ও / পি একক তালিকায় সমতল হয় [1, 2, 1, 2, 3, 1, 2, 3, 4]
সূত্র: https://www.linkedin.com/pulse/differences-between-map-flatmap-transformations-spark-pyspark-pandey/
মানচিত্র:
হ'ল একটি উচ্চতর অর্ডার পদ্ধতি যা ইনপুট হিসাবে একটি ফাংশন নেয় এবং উত্স আরডিডি-র প্রতিটি উপাদানকে এটি প্রয়োগ করে।
সমতল মানচিত্র:
একটি উচ্চতর অর্ডার পদ্ধতি এবং রূপান্তর অপারেশন যা একটি ইনপুট ফাংশন নেয় takes
মানচিত্র এবং ফ্ল্যাটম্যাপের আউটপুটটিতে পার্থক্য:
1।flatMap
val a = sc.parallelize(1 to 10, 5)
a.flatMap(1 to _).collect()
আউটপুট:
1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
২ map
:
val a = sc.parallelize(List("dog", "salmon", "salmon", "rat", "elephant"), 3)
val b = a.map(_.length).collect()
আউটপুট:
3 6 6 3 8
সেই জমি বিক্রি করার
RDD.map
এবংRDD.flatMap
এ এ্যাপাচি স্পার্ক । সাধারণভাবে, স্পার্কের আরডিডি ক্রিয়াকলাপগুলি তাদের সম্পর্কিত স্কাল সংগ্রহ ক্রিয়াকলাপের পরে মডেল করা হয়। স্ট্যাকওভারফ্লো . com / q / 1059776 / 590203 এর উত্তরগুলি , যা স্কালার মধ্যেmap
এবং এরflatMap
মধ্যে পার্থক্য নিয়ে আলোচনা করে , আপনার পক্ষে সহায়ক হতে পারে।