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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。