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


Python pyspark GroupedData.applyInPandas用法及代碼示例

本文簡要介紹 pyspark.sql.GroupedData.applyInPandas 的用法。

用法:

GroupedData.applyInPandas(func, schema)

使用 pandas udf 映射當前 DataFrame 的每一組,並將結果作為 DataFrame 返回。

該函數應采用 pandas.DataFrame 並返回另一個 pandas.DataFrame 。對於每個組,所有列作為 pandas.DataFrame 一起傳遞給 user-function,返回的 pandas.DataFrame 組合為 DataFrame

schema 應該是一個 StructType 說明返回的 pandas.DataFrame 的架構。如果指定為字符串,則返回的pandas.DataFrame 的列標簽必須與已定義架構中的字段名稱匹配,如果不是字符串,則必須按位置匹配字段數據類型,例如整數索引。返回的pandas.DataFrame 的長度可以是任意的。

3.0.0 版中的新函數。

參數

func函數

一個 Python 本機函數,它采用 pandas.DataFrame 並輸出 pandas.DataFrame

schema pyspark.sql.types.DataType 或 str

PySpark 中func 的返回類型。該值可以是 pyspark.sql.types.DataType 對象或 DDL 格式的類型字符串。

注意

此函數需要完全洗牌。一個組的所有數據都將加載到內存中,因此如果數據傾斜並且某些組太大而無法放入內存,用戶應該注意潛在的 OOM 風險。

如果返回使用字典構造的新 pandas.DataFrame,建議按名稱顯式索引列以確保位置正確,或者使用 OrderedDict 。例如,pd.DataFrame({‘id’: ids, ‘a’: data}, columns=[‘id’, ‘a’])pd.DataFrame(OrderedDict([(‘id’, ids), (‘a’, data)]))

此 API 是實驗性的。

例子

>>> import pandas as pd  
>>> from pyspark.sql.functions import pandas_udf, ceil
>>> df = spark.createDataFrame(
...     [(1, 1.0), (1, 2.0), (2, 3.0), (2, 5.0), (2, 10.0)],
...     ("id", "v"))  
>>> def normalize(pdf):
...     v = pdf.v
...     return pdf.assign(v=(v - v.mean()) / v.std())
>>> df.groupby("id").applyInPandas(
...     normalize, schema="id long, v double").show()  
+---+-------------------+
| id|                  v|
+---+-------------------+
|  1|-0.7071067811865475|
|  1| 0.7071067811865475|
|  2|-0.8320502943378437|
|  2|-0.2773500981126146|
|  2| 1.1094003924504583|
+---+-------------------+

或者,用戶可以傳遞一個帶有兩個參數的函數。在這種情況下,分組鍵將作為第一個參數傳遞,數據將作為第二個參數傳遞。分組鍵將作為 numpy 數據類型的元組傳遞,例如 numpy.int32numpy.float64 。數據仍將作為 pandas.DataFrame 傳入,其中包含原始 Spark DataFrame 中的所有列。當用戶不想在函數中硬編碼分組鍵時,這很有用。

>>> df = spark.createDataFrame(
...     [(1, 1.0), (1, 2.0), (2, 3.0), (2, 5.0), (2, 10.0)],
...     ("id", "v"))  
>>> def mean_func(key, pdf):
...     # key is a tuple of one numpy.int64, which is the value
...     # of 'id' for the current group
...     return pd.DataFrame([key + (pdf.v.mean(),)])
>>> df.groupby('id').applyInPandas(
...     mean_func, schema="id long, v double").show()  
+---+---+
| id|  v|
+---+---+
|  1|1.5|
|  2|6.0|
+---+---+
>>> def sum_func(key, pdf):
...     # key is a tuple of two numpy.int64s, which is the values
...     # of 'id' and 'ceil(df.v / 2)' for the current group
...     return pd.DataFrame([key + (pdf.v.sum(),)])
>>> df.groupby(df.id, ceil(df.v / 2)).applyInPandas(
...     sum_func, schema="id long, `ceil(v / 2)` long, v double").show()  
+---+-----------+----+
| id|ceil(v / 2)|   v|
+---+-----------+----+
|  2|          5|10.0|
|  1|          1| 3.0|
|  2|          3| 5.0|
|  2|          2| 3.0|
+---+-----------+----+

相關用法


注:本文由純淨天空篩選整理自spark.apache.org大神的英文原創作品 pyspark.sql.GroupedData.applyInPandas。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。