我正在尝试理解Spark Streaming中的Spark DStream变换。
我知道相比于map,transform更加优越,但是能否有人给我一些实时的例子或者清晰的例子来区分transform和map?
我正在尝试理解Spark Streaming中的Spark DStream变换。
我知道相比于map,transform更加优越,但是能否有人给我一些实时的例子或者清晰的例子来区分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找到有用的信息。
map
是一种基本的转换函数,而transform
则是RDD的一种转换方式。
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 执行了联合操作。
Map将在特定批次中作用于RDD的每个元素,并在应用于Map的函数后生成RDD。
DStream有几个RDD,因为每个批次间隔是不同的RDD。
所以通过使用transform(),您有机会在整个DStream上应用一个RDD操作。
来自Spark文档的示例: http://spark.apache.org/docs/latest/streaming-programming-guide.html#transform-operation
例子1)
一群人排队进入一个房间,换衣服,然后娶自己选择的女人。
1)换衣服是映射操作(他们将自己转化为属性)
2)娶女人是在你身上进行合并/过滤操作,但受其他人影响,我们可以称之为真正的转换操作。
例子2)
学生进入大学,有些人参加了两节课,其他人参加了四节课,等等。
1)参加讲座是映射操作,通常是学生所做的。
2)但要确定讲师教授了什么取决于讲师RDD数据,他的日程安排。
假设Transform操作是您要过滤或验证以识别适合您的正确数据的维度或静态表,并删除可能的垃圾。