當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。