Spark流处理中,Spark Transform和map之间的确切区别是什么?

13

我正在尝试理解Spark Streaming中的Spark DStream变换。

我知道相比于map,transform更加优越,但是能否有人给我一些实时的例子或者清晰的例子来区分transform和map?


6个回答

18

5

map是一种基本的转换函数,而transform则是RDD的一种转换方式。

map


map(func):通过将源DStream的每个元素传递给函数func来返回一个新的DStream。

以下示例演示了在DStream上执行map操作和transform操作。

val conf = new SparkConf().setMaster("local[*]").setAppName("StreamingTransformExample")
val ssc = new StreamingContext(conf, Seconds(5))    

val rdd1 = ssc.sparkContext.parallelize(Array(1,2,3))
val rdd2 = ssc.sparkContext.parallelize(Array(4,5,6))
val rddQueue = new Queue[RDD[Int]]
rddQueue.enqueue(rdd1)
rddQueue.enqueue(rdd2)

val numsDStream = ssc.queueStream(rddQueue, true)
val plusOneDStream = numsDStream.map(x => x+1)
plusOneDStream.print()

map操作会将DStream中所有RDD的每个元素加1,输出结果如下

-------------------------------------------
Time: 1501135220000 ms
-------------------------------------------
2
3
4

-------------------------------------------
Time: 1501135225000 ms
-------------------------------------------
5
6
7

-------------------------------------------

转换


transform(func):通过将 RDD 到 RDD 函数应用于源 DStream 的每个 RDD,返回一个新的 DStream。这可以用于在 DStream 上执行任意的 RDD 操作。

val commonRdd = ssc.sparkContext.parallelize(Array(0))
val combinedDStream = numsDStream.transform(rdd=>(rdd.union(commonRdd)))
combinedDStream.print()

transform允许在DStream中对包含的RDD进行操作,如join、union等。下面给出的示例代码将产生以下输出:

-------------------------------------------
Time: 1501135490000 ms
-------------------------------------------
1
2
3
0

-------------------------------------------
Time: 1501135495000 ms
-------------------------------------------
4
5
6
0

-------------------------------------------
Time: 1501135500000 ms
-------------------------------------------
0

-------------------------------------------
Time: 1501135505000 ms
-------------------------------------------
0
-------------------------------------------

这里的 commonRdd 包含元素 0,与 DStream 内所有基础 RDD 执行了联合操作。


1
Spark Streaming中的转换函数允许您在流中对底层RDD执行任何转换。例如,您可以使用Transform在流中加入两个RDD,其中一个RDD是由textfile或并行集合制成的,另一个RDD来自textfile / socket等流。

Map将在特定批次中作用于RDD的每个元素,并在应用于Map的函数后生成RDD。


1

0

例子1)

一群人排队进入一个房间,换衣服,然后娶自己选择的女人。

1)换衣服是映射操作(他们将自己转化为属性)

2)娶女人是在你身上进行合并/过滤操作,但受其他人影响,我们可以称之为真正的转换操作。

例子2)

学生进入大学,有些人参加了两节课,其他人参加了四节课,等等。

1)参加讲座是映射操作,通常是学生所做的。

2)但要确定讲师教授了什么取决于讲师RDD数据,他的日程安排。

假设Transform操作是您要过滤或验证以识别适合您的正确数据的维度或静态表,并删除可能的垃圾。


0
如果我有来自0-1秒的数据"Hello How",并且在接下来的1-2秒内是"Are You"。那么对于上面展示的按键映射和归约示例,将会产生输出(hello,1)和(How,1)作为第一批次的结果,以及(are,1)和(you,1)作为下一批次的结果。但是对于使用"转换函数"的下一个示例,输出结果会有什么不同?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接