最近一直在学习Spark的RDD编程,学习的过程中经常会踩到很多的坑。归根结底,其实是没有理解好RDD编程其中的原理。
学习的过程中值得注意的小细节(个人的一些偏门理解,帮助自己更好掌握)。
1.RDD中的其中一个元素中含有多个元素,类似一个列表在RDD中充当一个元素时,列表的相关的索引查询,切片操作同样适用。
#省略了前面的引用
array = ["Spark is fast","Hadoop is good"]
rdd1 = sc.parallelize(array)
rdd2 = rdd1.map(lambda x:x.split(" ") #将rdd1中的每个元素中的内容以空格分隔开,得到[['Spark','is','fast'],['Hadoop','is','good']]
rdd3 = rdd2.map(lambda x:x[0]) #索引返回第0个,得到['Spark','Hadoop']
#rdd3 = rdd2.map(lambda x:x[0:2])
#索引返回第0-1个,得到[['Spark','is'],['Hadoop','is']]
2.利用map函数可以实现RDD生成RDD键值对,换而言之map函数可以实现对现有RDD的数据形态进行改变。
array = ['Spark','Hadoop','python','SQL','Big Data']
rdd1 = sc.parallelize(array)
rdd2 = rdd1.map(lambda x:(x,1))
#rdd2 = [('Spark',1),('Hadoop',1),('python',1),('SQL',1),('Big Data',1)]
rdd3 = rdd2.map(lambda x:x[0])
#rdd3 = ['Spark', 'Hadoop', 'python', 'SQL', 'Big Data']
3.利用filter()函数返回特定的值,可以采取key-value的思维,指定元素中特定值的‘key’,返回所有values。
array = ["Spark is fast","Hadoop is good"]
rdd1 = sc.parallelize(array)
rdd2 = rdd1.map(lambda x:x.split(" ")
rdd3 = rdd2.filter(lambda x:x[0] == 'Spark')
#返回x[0] = 'Spark'的所有值,rdd3=[['Spark', 'is', 'fast']]
4.union()与join(),两者都是合并rdd,但在合并形式上有所不同。
array1 = [('Spark',1),('Hadoop',1)]
array2 = [('Spark',2),('Hadoop',2)]
rdd1 = sc.parallelize(array1)
rdd2 = sc.parallelize(array2)
RDD1 = rdd1.union(rdd2)
#union类似并集,[('Spark',1),('Hadoop',1),('Spark',2),('Hadoop',2)]
RDD2 = rdd1.join(rdd2)
#join是内连接,[('Spark',(1,2)),('Hadoop',(1,2))]
后续的学习中遇到问题,会继续更新。



