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.int32
和numpy.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| +---+-----------+----+
相關用法
- Python pyspark GroupedData.apply用法及代碼示例
- Python pyspark GroupedData.agg用法及代碼示例
- Python pyspark GroupedData.avg用法及代碼示例
- Python pyspark GroupedData.mean用法及代碼示例
- Python pyspark GroupedData.pivot用法及代碼示例
- Python pyspark GroupedData.max用法及代碼示例
- Python pyspark GroupedData.count用法及代碼示例
- Python pyspark GroupedData.min用法及代碼示例
- Python pyspark GroupedData.sum用法及代碼示例
- Python pyspark GroupBy.mean用法及代碼示例
- Python pyspark GroupBy.head用法及代碼示例
- Python pyspark GroupBy.cumsum用法及代碼示例
- Python pyspark GroupBy.rank用法及代碼示例
- Python pyspark GroupBy.bfill用法及代碼示例
- Python pyspark GroupBy.cummin用法及代碼示例
- Python pyspark GroupBy.cummax用法及代碼示例
- Python pyspark GroupBy.fillna用法及代碼示例
- Python pyspark GroupBy.apply用法及代碼示例
- Python pyspark GroupBy.diff用法及代碼示例
- Python pyspark GroupBy.filter用法及代碼示例
- Python pyspark GroupBy.transform用法及代碼示例
- Python pyspark GroupBy.cumcount用法及代碼示例
- Python pyspark GroupBy.idxmax用法及代碼示例
- Python pyspark GroupBy.shift用法及代碼示例
- Python pyspark GroupBy.idxmin用法及代碼示例
注:本文由純淨天空篩選整理自spark.apache.org大神的英文原創作品 pyspark.sql.GroupedData.applyInPandas。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。