在10分钟内实用Apache Spark。第2部分-RDD
Spark的主要抽象是称为“弹性分布式数据集(RDD)”的项目的分布式集合。它是元素的容错集合,允许对其自身进行并行操作。可以从Hadoop InputFormats(例如HDFS文件)或通过转换其他RDD创建RDD。
创建RDD
Spark提供了两种创建RDD的方法:加载外部数据集和并行化驱动程序中的集合。
创建RDD的最简单方法是在程序中获取现有集合,并将其传递给SparkContext的 parallelize()方法。
例如,在不同的编程语言中,它将如下所示:
VAL输入= sc.parallelize(列表(1,2,3,4))
号码= sc.parallelize([ 1,2,3,4 ])
JavaRDD <Integer>的RDD = sc.parallelize(Arrays.asList(1,2,3,4))
另一种方法是从文件读取:
val行= sc.textFile(“ README.md”)
行数= sc.textFile(“ README.md”)
JavaRDD <String>行= sc.textFile(“ README.md”)
RDD操作
RDD支持两种类型的操作:转换和操作。转换是对RDD的操作,它从现有的RDD创建一个新的RDD。操作将结果返回到驱动程序。Spark中的所有转换都是惰性的。这意味着,他们不会立即计算出结果,他们只会记住应用于基本数据集(或文件)的所有转换。仅当操作要求将结果返回到驱动程序或写入存储时,才计算转换。
转变
让我们创建一个RDD向量并对其进行一些转换。在此示例中,我们将使用Pyspark。
小提示:如果要取消显示Spark日志记录,请执行以下操作:
sc.setLogLevel(“ ERROR”)
NUM = sc.parallelize([ 4,6,6,1,3,0,2,2,2 ])
所述map(function)变换返回一个新的RDD,施加函数到原来的每个元素。
结果= num.map(lambda x:x ** 2)
目前,Spark只记得这些转换。为了获得实际结果,我们需要使用一个动作。Like take(),它从RDD中获取指定数量的元素。
result.take(10)
[16、36、36、1、9、0、4、4、4]
该 filter(function)转换返回一个新的RDD,只保留那些,对此功能进行评估,以正确的。
结果= num.filter(lambda x:x> = 3)result.take(10)
[4,6,6,3]
该 distinct()转换返回一个新的RDD,从原始数据集删除所有副本。
结果= num.distinct()
result.take(10)
[0,1,2,3,4,6]
如果我们有两个RDD,我们也可以对其进行一些转换。让我们创建一个新的RDD:
NUM2 = sc.parallelize([ 5,5,8,2,2,1,7,3,3 ])
该 union(other)转换返回一个新的数据集,其中包含来自RDDS所有元素。
结果= num.union(num2)结果.take(20)
[4、6、6、1、3、0、2、2、2、5、5、8、2、2、1、7、3、3]
一个 intersection(other)返回的数据集,其中只包含两个RDDS找到的元素。
结果= num.intersection(num2)result.take(20)
[2,1,3]
该 subtract(other)改造消除了其他RDD的所有内容。
结果= num.subtract(num2)
result.take(20)
[0,4,6,6]
我们还可以计算两个数据集的 笛卡尔积 。该 cartesian(other)变换返回所有对(A,B),其中的数据集一个属于原始数据集,和 b 到其他。
结果= num.cartesian(num2)
result.take(20)
[(4,5),(4,5),(4,8),(4,2),(4,2),(4,1),(4,7),(4,3),( 4,3),(6,5),(6
动作
如前所述,动作会返回一些值。例如,我们可以使用简单的命令对数据集中的元素进行计数:
num.count()
9
计算RDD中元素的出现次数。此操作将返回一个(value, count)元素的字典。
num.countByValue()
defaultdict(<类型'int'>,{0:1,1:1,2:2:3,3:1,1,4:1,6:2})
collect 以列表形式返回数据集中的所有元素
num.collect()
[4,6,6,1,3,0,2,2,2]
top 从RDD返回一些top元素
num.top(3)
[6,6,4]
takeOrdered 以升序返回多个元素
num.takeOrdered(5)
[0,1,2,2,2]
RDD上最常见的操作是 reduce(function)
num.reduce(lambda x,y:x + y)
[26]
现在,让我们看一下该 fold()动作,该动作类似于reduce() and 几乎相同的动作,但是允许为初始调用取 零值。
num.fold(0,lambda x,y:x + y)
[26]
的 aggregate()功能使我们不必返回是同一类型,因为我们正在处理的RDD的约束。让我们仔细看一下此函数,并逐步完成简单的示例:
NUM = sc.parallelize([ 4
sumCount
(3456,9)
(1
键值对的RDD
Spark对包含键值对的RDD提供特殊的操作。这些RDD称为对RDD。对RDD在许多程序中是一个有用的构建块,因为它们公开了允许您并行地对每个键进行操作或在网络上重新组合数据的操作。
键值对的RDD也支持RDD之类的某些操作。这是我们下一篇博客文章的主题。
结论
在有关使用Apache Spark的教程系列的第二篇文章中,我们已引导您完成Apache Spark的RDD(它的主要抽象)。使用RDD编程 指南 可了解有关可使用的命令和操作的更多信息。
题库