用户名*
邮箱*
密码*
确认密码*
验证码* 点击图片更换验证码
找回密码
忘记密码了?输入你的注册邮箱,并点击重置,稍后,你将会收到一封密码重置邮件。
第一个问题中的两种方式是有区别的:
1. 直接用sc.textFile生成RDD,这个RDD里面存储的是一些元信息,包含文件名等。对它进行filter、collect操作的时候,会根据RDD对应的文件信息将RDD划分成多个partition,每个partition的处理过程作为一个task分发到executor端执行。执行完之后driver将partition collect后的结果聚合到driver端。
2. 第二段代码你在textFile和filter两个操作中间加了两个动作,一个对初始的rdd进行collect,然后对结果进行parallelize。大家都知道collect是一个action操作,返回的是一个scala标量,即相当于你把文件读出来,生成rdd,然后把rdd的每个partition结果算出来,聚合到driver端,再使用parallelize方法生成一个新的RDD。
第二段代码比第一段代码多了一个collect再重生成RDD的操作(这个场景中,这两步是没有必要的),会慢很多。
第二个问题:会。sqlcontext相当于把原来的rdd封装了一层,变成了dataframe
对于第一个问题的理解我是跟你一样的
我的理解是parallelize在你不指定资源的时候生效。而分块,存在hdfs上的文件本身就是分块的,所以应该是直接将job代码发到块所在的机器然后执行。
我也是初学,我尝试下回答第一个问题(个人理解)
1、RDD 记录的只是 它从哪里来?经过怎样的加工转换而来?
所以在调用所有的转换操作,都不会真实的操作数据,仅仅只是新生了一个RDD
只有调用的action类型的操作,才会触发对数据的一系列转换动作。
昵称*
E-Mail*
回复内容*
回复 ( 4 )
第一个问题中的两种方式是有区别的:
1. 直接用sc.textFile生成RDD,这个RDD里面存储的是一些元信息,包含文件名等。对它进行filter、collect操作的时候,会根据RDD对应的文件信息将RDD划分成多个partition,每个partition的处理过程作为一个task分发到executor端执行。执行完之后driver将partition collect后的结果聚合到driver端。
2. 第二段代码你在textFile和filter两个操作中间加了两个动作,一个对初始的rdd进行collect,然后对结果进行parallelize。大家都知道collect是一个action操作,返回的是一个scala标量,即相当于你把文件读出来,生成rdd,然后把rdd的每个partition结果算出来,聚合到driver端,再使用parallelize方法生成一个新的RDD。
第二段代码比第一段代码多了一个collect再重生成RDD的操作(这个场景中,这两步是没有必要的),会慢很多。
第二个问题:会。sqlcontext相当于把原来的rdd封装了一层,变成了dataframe
对于第一个问题的理解我是跟你一样的
我的理解是parallelize在你不指定资源的时候生效。而分块,存在hdfs上的文件本身就是分块的,所以应该是直接将job代码发到块所在的机器然后执行。
我也是初学,我尝试下回答第一个问题(个人理解)
1、RDD 记录的只是 它从哪里来?经过怎样的加工转换而来?
所以在调用所有的转换操作,都不会真实的操作数据,仅仅只是新生了一个RDD
只有调用的action类型的操作,才会触发对数据的一系列转换动作。