DStream 和 map 中的 Spark Transform 之间的确切区别是什么?

what is exact difference between Spark Transform in DStream and map.?

我正在尝试了解 Spark Streaming 中 Spark DStream 的转换。

我知道 transform 与 map 相比要好得多,但是 有人可以给我一些可以区分变换和映射的实时示例或清晰示例吗?

Spark 流中的 transform 函数允许在流的基础 RDDs 上使用 Apache Spark 的任何转换。 map 用于元素到元素的转换,可以使用 transform 实现。本质上,map 处理 DStream 的元素,而 transform 允许您处理 DStream 的 RDDs。您可能会发现 http://spark.apache.org/docs/latest/streaming-programming-guide.html#transformations-on-dstreams 很有用。

DStream 有几个 RDD,因为每个批次间隔都是不同的 RDD。
因此,通过使用 transform(),您有机会在对象上应用 RDD 操作 整个DStream。

Spark 文档中的示例: http://spark.apache.org/docs/latest/streaming-programming-guide.html#transform-operation

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

的 Stream

Map 在特定批次中处理 RDD 的每个元素,并在应用传递给 Map 的函数后生成 RDD。

map 是基本变换,transform 是 RDD 变换

地图


map(func) : Return a new DStream by passing each element of the source DStream through a function func.

这是一个示例,它演示了 DStream 上的映射操作和转换操作

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) : Return a new DStream by applying a RDD-to-RDD function to every RDD of the source DStream. This can be used to do arbitrary RDD operations on the DStream.

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

transform 允许对 DStream 中的 RDD 执行诸如 join、union 等 RDD 操作,此处给出的示例代码将产生如下输出

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

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

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

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

此处包含元素 0commonRdd 与 DStream 中的所有底层 RDD 执行联合操作。

示例 1)

排队的男人进入房间,换衣服,然后与他们选择的女人结婚。

1) 换装是map操作(属性是自己变换的)

2) 娶女人是对你的merge/filter操作,但在别人的影响下,我们可以称之为真正的转换操作。

示例 2) 学生进入大学,少数人听了2节课,其他人听了4节课,以此类推。

1) 听课就是图操作,一般学生都在做

2) 但要确定讲师教给他们的内容取决于讲师 RDD 数据,他的日程安排。

假设转换操作是您要过滤或验证的维度或静态 table 以确定适合您的数据,并且删除可能是垃圾。

如果我有 0-1 秒的数据 "Hello How" 以及接下来 1-2​​ 秒的“你是吗”。然后,在 map 和 reduce by key 示例的情况下,如上所示将为第一批产生输出 (hello,1) 和 (How,1),并为下一批产生输出 (are,1) 和 (you,1) batch.But 与下一个示例类似,使用 "transform function" 输出

会有什么不同