Spark RDD的创建和操作

——创建RDD

2种方式 读取外部数据集 或 在驱动器程序中对一个集合进行并行化

最简单方式把已有的集合传给SparkContext的Parallelize()方法

lines=sc.parallelize(["pandas","apple"])  //python中的parallelize()方法

val lines=sc.parallelize(list("pandas","apple")) //Scala中的parallelize()方法

JavaRDD<String> lines=sc.parallelize(Arrays.aslist("pandas","apple"));//Java中的parallelize()方法

更常用的方法是从外部存储中读取数据来创建RDD

lines=sc.textFile("/path/test.txt")//python中的textFile()方法

val lines=sc.textFile("/path/test.txt")//Scala中的textFile()方法

JavaRDD<String> lines=sc.textFile("/path/test.txt");//Java中的textFile()方法

 ——RDD操作

转化操作

RDD的转化操作返回新的RDD 转化的RDD是惰性求值的,只有延迟到行动操作才会优化计算,转化操作一般针对RDD数据集的单个元素的,也就是说,这些转化操作大多每次只会操作RDD的一个元素

//Python实现filter()转化操作
inputRDD=sc.textFile("log.txt")
errorRDD=inputRDD.filter(lambda x:"error" in x)

//Scala实现filter()转化操作
val inputRDD=sc.textFile("log.txt")
val errorRDD=inputRDD.filter(lambda x:"error" in x)

//Java实现filter()转化操作
JavaRDD<String> inputRDD=sc.textFile("log.txt");
JavaRDD<String> errorRDD=inputRDD.filter(
new Function<String,boolean>()
{
  public boolean call(String x)
  {

     return x.contain("error");

   }
}

);

filter()操作不会该变已有的inputRDD中的数据,该操作会返回一个全新的RDD,inputRDD在后面的程序还可以继续使用 

只会类似的求得warningRDD 并调用union()操作合并RDD

 

行动操作

对于需要对数据集RDD进行实际的计算,就需要行动操作的支持,它们会把计算结果返回到驱动器程序,或写入外部存储中,由于行动操作需要结果,因而会触发真正的计算链

//读取unionRDD的前10条数据
print unionRDD.count()
for line in unionRDD.take(10)
    print line

//Java中读取前10条
System.out.println(unionRDD.count());
for(String line:unionRDD.take(10))
    System.out.println(line);

在驱动器程序中执行take()获取RDD的少量元素,然后读取打印这些元素

RDD还有一个collect()函数,可以获取整个RDD的元素,如果RDD数据集已经被筛选为很小一个时,可以考虑使用本地处理,不过不建议使用,即collect()不能用在大规模的数据集上

而一般对RDD的之后处理是把数据写入HDFS等分布式存储系统中,可以使用saveAsTextFile()  saveAsSequenceFile()把数据按照一定格式进行存储 

由于调用一个新的行动操作会触发计算链,因此为了避免低效的行为,应当适当的把中间结果持久化

猜你喜欢

转载自blog.csdn.net/qq_33369979/article/details/88776084