pyspark.RDD


RDD全称为弹性分布式数据集,是Spark中的基本概念, 表示可以并行操作的不可变的分区元素集合。

coalesce(numPartitions, shuffle=False)

  • 返回一个缩减为numPartitions分区的新RDD。
sc.parallelize([1, 2, 3, 4, 5], 3).glom().collect()
#[[1], [2, 3], [4, 5]]
sc.parallelize([1, 2, 3, 4, 5], 3).coalesce(1).glom().collect()
#[[1, 2, 3, 4, 5]]

collectAsMap()

  • 将此RDD中的键值对作为字典返回到master。
sc.parallelize([(1, 2), (3, 4)]).collectAsMap()
#{1: 2, 3: 4}

countByKey()、countByValue()

  • 为每个key或者value计算元素的数目,返回字典
rdd = sc.parallelize([("a", 1), ("b", 1), ("a", 1)])
rdd.countByKey()
#defaultdict(int, {'a': 2, 'b': 1})
sc.parallelize([1, 2, 1, 2, 2], 2).countByValue()
#defaultdict(int, {1: 2, 2: 3})

filter()

  • 过滤操作
rdd = sc.parallelize([1, 2, 3, 4, 5])
rdd.filter(lambda x: x % 2 == 0).collect()
#[2, 4]

flatMap()

  • 通过首先将函数应用于此RDD的所有元素,然后展平结果,返回新的RDD
rdd = sc.parallelize([2, 3, 4])
rdd.flatMap(lambda x: range(1, x)).collect()
#[1, 1, 2, 1, 2, 3]

glom()

  • 返回通过将每个分区中的所有元素合并到列表中而创建的RDD。
rdd = sc.parallelize([1, 2, 3, 4], 2)
rdd.glom().collect()
#[[1, 2], [3, 4]]

groupBy()

  • 分组
rdd = sc.parallelize([1, 1, 2, 3, 5, 8])
result=rdd.groupBy(lambda x: x % 2).collect()
sorted([(x, sorted(y)) for (x, y) in result])
#[(0, [2, 8]), (1, [1, 1, 3, 5])]

groupByKey()

  • 根据key对value进行分组
rdd = sc.parallelize([("a", 1), ("b", 1), ("a", 1)])
rdd.groupByKey().mapValues(len).collect()
# [('a', 2), ('b', 1)]
rdd.groupByKey().mapValues(list).collect()
# [('a', [1, 1]), ('b', [1])]

map()

  • 太简单,就不讲了
rdd = sc.parallelize(["b", "a", "c"])
rdd.map(lambda x: (x, 1)).collect()
#[('a', 1), ('b', 1), ('c', 1)]

mapValues()

  • 对每个key的value执行函数,并返回
x = sc.parallelize([("a", ["apple", "banana", "lemon"]), ("b", ["grapes"])])
def f(x): return len(x)
x.mapValues(f).collect()
#[('a', 3), ('b', 1)]

reduce()

  • 对RDD中的所有元素使用特定的函数进行聚合操作
from operator import add
>>> sc.parallelize([1, 2, 3, 4, 5]).reduce(add)
15

reduceByKey()

  • 对所有相同key的value进行聚合操作
>>> from operator import add
>>> rdd = sc.parallelize([("a", 1), ("b", 1), ("a", 1)])
>>> sorted(rdd.reduceByKey(add).collect())
[('a', 2), ('b', 1)]

sample()

  • 对RDD进行采样,返回子集
>>> rdd = sc.parallelize(range(100), 4)
>>> rdd.sample(False, 0.1, 81).collect()
[4, 26, 39, 41, 42, 52, 63, 76, 80, 86, 97]

sortBy()、sortByKey()

  • 按关键字/函数排序
>>> tmp = [('a', 1), ('b', 2), ('1', 3), ('d', 4), ('2', 5)]
>>> sc.parallelize(tmp).sortBy(lambda x: x[0]).collect()
[('1', 3), ('2', 5), ('a', 1), ('b', 2), ('d', 4)]
>>> tmp = [('a', 1), ('b', 2), ('1', 3), ('d', 4), ('2', 5)]
>>> sc.parallelize(tmp).sortByKey().first()
('1', 3)

takeOrdered()

  • 从RDD中获取N个元素,这些元素按升序排列或由可选键函数指定。
>>> sc.parallelize([10, 1, 2, 9, 3, 4, 5, 6, 7]).takeOrdered(6)
[1, 2, 3, 4, 5, 6]
>>> sc.parallelize([10, 1, 2, 9, 3, 4, 5, 6, 7], 2).takeOrdered(6, key=lambda x: -x)
[10, 9, 7, 6, 5, 4]

以上总结是一些RDD中常见函数的基本用法,后面会陆续更新一些高阶用法。

发布了24 篇原创文章 · 获赞 2 · 访问量 1190

猜你喜欢

转载自blog.csdn.net/qq_40176087/article/details/99777764