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


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