pyspark_DataFrame和RDD常见操作

二、DataFrame操作

  • 数据
spark = SparkSession.builder.appName('df_action').getOrCreate()
pairs = [(10,"z1"), (1,"z2"), (2,"z3"), (9,"z4"), (3,"z5"), (4,"z6"), (5,"z7"), (6,"z8"), (7,"z9")]
df = spark.createDataFrame(pairs, ['number', 'name'])

triplets = [("alex", "Ames", 20),
            ("alex", "Sunnyvale", 30),
            ("alex", "Cupertino", 40),
            ("mary", "Ames", 35),
            ("mary", "Stanford", 45),
            ("mary", "Campbell", 55),
            ("jeff", "Ames", 60),
            ("jeff", "Sunnyvale", 70),
            ("jane", "Austin", 80)]

df1 = spark.createDataFrame(triplets, ["name", "city", "age"])

2.1 describe

df.describe().show()
"""
+-------+-----------------+----+
|summary|           number|name|
+-------+-----------------+----+
|  count|                9|   9|
|   mean|5.222222222222222|null|
| stddev|3.073181485764296|null|
|    min|                1|  z1|
|    max|               10|  z9|
+-------+-----------------+----+
"""

2.2 drop

df1_drop = df1.drop('city')
df1_drop.show()

2.3 join

方法和pandas的merge相似

df1.join(df_join, df1.name == df_join.name, 'cross')
# join 方式
#        inner, cross, outer, full, full_outer, left,
#        left_outer, right, right_outer, left_semi,
#        and left_anti

2.4 sql

方法和sql一样

df.createOrReplaceTempView('df_name')
spark.sql('select name, count(1) from df_name
group by name').show()

2.5 withColumn 增加列

df_withcol = df1.withColumn('age2', df1.age + 2)
df_withcol.show()

# 同样可以用SQL方法实现
df.createOrReplaceTempView('df_name')
spark.sql('select *, age + 2 as agw2 from df_name').show()

三、RDD操作

  • 数据
def tokenize(record):
    tokens = record.split(' ')
    mylist = []
    for word in tokens:
        if len(word) > 2:
            mylist.append(word)
    return mylist

b = [('p', 50), ('x', 60), ('y', 70), ('z', 80) ]
a = [('a', 2), ('b', 3), ('c', 4)]
rdd_a = spark.sparkContext.parallelize(a)
rdd_b = spark.sparkContext.parallelize(b)

3.1 cartesian

卡迪尔叠加

cart = rdd_a.cartesian(rdd_b)

3.2 filter

rdd_f = rdd_b.filter(lambda x: x[1] > 55)

3.3 flatmap

list_of_strings = ['of', 'a fox jumped',
                   'fox jumped of fence', 'a foxy fox jumped high']
rdd_flat = spark.sparkContext.parallelize(list_of_strings)
rdd_flated = rdd_flat.flatMap(lambda rec: tokenize(rec))

3.4 join

source_pairs = [(1, "u"), (1, "v"), (2, "a"), (3, "b"), (4, "z1")]
source = spark.sparkContext.parallelize(source_pairs)

other_pairs = [(1, "x"), (1, "y"), (2, "c"), (2, "d"), (3, "m"), (8, "z2")]
other = spark.sparkContext.parallelize(other_pairs)
joined = source.join(other)
# [(1, ('u', 'x')), (1, ('u', 'y')), (1, ('v', 'x')), (1, ('v', 'y')), (2, ('a', 'c')), (2, ('a', 'd')), (3, ('b', 'm'))]

3.5 mapPartitions

3.5.1 mapPartitions例子

numbers = ["10,20,3,4",
           "3,5,6,30,7,8",
           "4,5,6,7,8",
           "3,9,10,11,12",
           "6,7,13",
           "5,6,7,12",
           "5,6,7,8,9,10",
           "11,12,13,14,15,16,17"]
# len(numbers) == 8

rdd_em = spark.sparkContext.parallelize(numbers, 10)
min_max_count_rdd = rdd_em.mapPartitions(min_max_count)

3.5.2 每个分区内的iter处理(含空分区 和 分区内多iter)

def min_max_count(iterator: iter) -> list:
    try:
        n = 0
        for ite_i in iterator:
            n += 1
            numbers = ite_i.split(",")
            # convert strings to integers
            numbers = list(map(int, numbers))
            print(numbers)
            if n == 1 :
                local_min = min(numbers)
                local_max = max(numbers)
                local_count = len(numbers)
            else: # 处理partition小于时(含多个iter)
                if local_min > min(numbers):
                    local_min = min(numbers)
                if local_max < min(numbers):
                    local_max = min(numbers)
                local_count += len(numbers)
        return [(local_min, local_max, local_count)]
    except : # 处理partition 为空时
        # WHERE min > max to filter it out later
        return [(1, -1, 0)]

3.6 sortBy

  • sortByKey 根据主键
  • sortBy 用lambda 自定
pairs = [(10, "z1"), (1, "z2"), (2, "z3"), (9, "z4"), (3, "z5"), (4, "z6"), (5, "z7"), (6, "z8"), (7, "z9")]
rdd_st = spark.sparkContext.parallelize(pairs)
print('值排序,倒序', rdd_st.sortBy(lambda x:x[1], ascending = False).collect())
print('主键排序,倒序', rdd_st.sortByKey(ascending=False).collect())

3.7 takeOrdered

bottom3 = rdd_st.takeOrdered(3, key=lambda x: -x[0]) # return list
print("bottom3 = ", bottom3)

参考: https://github.com/mahmoudparsian/pyspark-algorithms

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PySpark RDD是一种分布式的数据集,它是PySpark的核心抽象之一。RDD代表弹性分布式数据集(Resilient Distributed Dataset),它是由一系列分区组成的可并行处理的集合。RDD可以包含任何类型的对象,并且可以在集群上进行并行操作。 PySpark RDD可以通过不同的方式创建,其中一种常见的方式是使用`sc.parallelize`方法,该方法可以将Python列表、NumPy数组或Pandas Series/Pandas DataFrame转换为Spark RDD。例如,通过以下代码可以使用列表创建一个RDD: ```python rdd = sc.parallelize([1, 2, 3, 4, 5]) ``` 这将创建一个名为`rdd`的RDD对象,其中包含了列表中的元素。RDD支持各种转换和操作,例如映射、过滤、排序和聚合等。你可以使用这些操作来对RDD进行变换和计算,最终得到你想要的结果。 PySpark提供了丰富的文档来帮助你了解RDD的更多细节和使用方法。你可以参考Spark官方网站的RDD编程指南和PySpark官方文档,它们提供了详细的介绍和示例代码,帮助你更好地理解和使用PySpark RDD。 总结起来,PySpark RDD是一种分布式的可并行处理的数据集,它可以通过不同的方式创建,例如使用`sc.parallelize`方法。RDD支持各种转换和操作,它是PySpark中非常重要的概念之一。 参考文献: Spark官方网站 - RDD编程指南:http://spark.apache.org/docs/latest/rdd-programming-guide.html PySpark官方文档:https://spark.apache.org/docs/latest/api/python/index.html

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Scc_hy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值