——创建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()把数据按照一定格式进行存储
由于调用一个新的行动操作会触发计算链,因此为了避免低效的行为,应当适当的把中间结果持久化