当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python PySpark SparkContext parallelize方法用法及代码示例


PySpark SparkContext 的 parallelize(~) 方法根据给定数据集创建 RDD(弹性分布式数据集)。

参数

1. c | any

要转换为 RDD 的数据。通常,您会传递一个值列表。

2. numSlices | int | optional

要使用的分区数。默认情况下,Spark 配置中设置的并行级别将用于分区数量:

sc.defaultParallelism # For my configs, this is set to 8



8

返回值

PySpark RDD (pyspark.rdd.RDD)。

例子

使用值列表创建 RDD

要创建 RDD,请使用 parallelize(~) 函数:

rdd = sc.parallelize(["A","B","C","A"])
rdd.collect()



['A', 'B', 'C', 'A']

我的 Spark 配置指定的默认分区数是:

rdd.getNumPartitions()



8

创建具有特定数量分区的 RDD

要使用具有 3 分区的列表创建 RDD:

rdd = sc.parallelize(["A","B","C","A"], numSlices=3)
rdd.collect()



['A', 'B', 'C', 'A']

在这里,Spark 将我们的列表分为 3 个sub-datasets。我们可以使用 glom() 方法查看每个分区的内容:

rdd.glom().collect()



[['A'], ['B'], ['C', 'A']]

我们确实可以看到有3个分区:

  • 分区一:'A'

  • 分区二:'B'

  • 分区三:'C''A'

请注意,相同的值 'A' 不一定会出现在同一个分区中 - 分区是根据列表的顺序简单完成的。

创建一对 RDD

要创建 RDD 对,请传递元组列表,如下所示:

rdd = sc.parallelize([("A",1),("B",1),("C",1),("A",1)], numSlices=3)
rdd.collect()



[('A', 1), ('B', 1), ('C', 1), ('A', 1)]

请注意,parallelize 不会根据键执行分区,如下所示:

rdd.glom().collect()



[[('A', 1)], [('B', 1)], [('C', 1), ('A', 1)]]

我们可以看到,就像前面的情况一样,分区是使用列表的顺序完成的。

注意

一对 RDD 本身并不是一种类型:

type(rdd)



pyspark.rdd.RDD

RDD 对的特殊之处在于,我们可以执行其他方法,例如 reduceByKey(~) ,它对键执行 groupby 并执行自定义缩减函数:

rdd = sc.parallelize([("A",1),("B",1),("C",1),("A",1)], numSlices=3)
new_rdd = rdd.reduceByKey(lambda a,b: a+b)
new_rdd.collect()



[('B', 1), ('C', 1), ('A', 2)]

这里,我们使用的归约函数是一个简单的求和。

从 Pandas 创建 RDD DataFrame

考虑以下 Pandas DataFrame:

import pandas as pd
df_pandas = pd.DataFrame({"A":[3,4],"B":[5,6]})
df_pandas



   A  B
0  3  5
1  4  6

要创建包含此 Pandas DataFrame 值的 RDD:

df_spark = spark.createDataFrame(df_pandas)
rdd = df_spark.rdd
rdd.collect()



[Row(A=3, B=5), Row(A=4, B=6)]

请注意如何仅保留 DataFrame 的值 - 列标签不包含在 RDD 中。

警告

尽管 parallelize(~) 可以直接接受 Pandas DataFrame,但这并没有给我们所需的 RDD:

import pandas as pd
df_pandas = pd.DataFrame({"A":[3,4],"B":[5,6]})
rdd = sc.parallelize(df_pandas)
rdd.collect()



['A', 'B']

如您所见,rdd 仅包含列标签,但不包含数据本身。

相关用法


注:本文由纯净天空筛选整理自Isshin Inada大神的英文原创作品 PySpark SparkContext | parallelize method。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。