回复 ( 4 )

  1. 狗叔
    理由
    举报 取消

    第一个问题中的两种方式是有区别的:

    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

  2. zbdhu
    理由
    举报 取消

    对于第一个问题的理解我是跟你一样的

  3. code777
    理由
    举报 取消

    我的理解是parallelize在你不指定资源的时候生效。而分块,存在hdfs上的文件本身就是分块的,所以应该是直接将job代码发到块所在的机器然后执行。

  4. 郭宁
    理由
    举报 取消

    我也是初学,我尝试下回答第一个问题(个人理解)

    1、RDD 记录的只是 它从哪里来?经过怎样的加工转换而来?

    所以在调用所有的转换操作,都不会真实的操作数据,仅仅只是新生了一个RDD

    只有调用的action类型的操作,才会触发对数据的一系列转换动作。

我来回答

Captcha 点击图片更换验证码