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


Python pyspark PandasCogroupedOps.applyInPandas用法及代码示例


本文简要介绍 pyspark.sql.PandasCogroupedOps.applyInPandas 的用法。

用法:

PandasCogroupedOps.applyInPandas(func, schema)

使用 pandas 对每个 cogroup 应用一个函数,并将结果作为 DataFrame 返回。

该函数应采用两个 pandas.DataFrame 并返回另一个 pandas.DataFrame 。对于 cogroup 的每一侧,所有列作为 pandas.DataFrame 一起传递给 user-function,返回的 pandas.DataFrame 组合为 DataFrame

schema 应该是一个 StructType 说明返回的 pandas.DataFrame 的架构。如果指定为字符串,则返回的pandas.DataFrame 的列标签必须与已定义架构中的字段名称匹配,如果不是字符串,则必须按位置匹配字段数据类型,例如整数索引。返回的pandas.DataFrame 的长度可以是任意的。

3.0.0 版中的新函数。

参数

func函数

一个 Python 本机函数,它采用两个 pandas.DataFrame 并输出一个 pandas.DataFrame ,或者采用一个元组(分组键)和两个 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 是实验性的。

例子

>>> from pyspark.sql.functions import pandas_udf
>>> df1 = spark.createDataFrame(
...     [(20000101, 1, 1.0), (20000101, 2, 2.0), (20000102, 1, 3.0), (20000102, 2, 4.0)],
...     ("time", "id", "v1"))
>>> df2 = spark.createDataFrame(
...     [(20000101, 1, "x"), (20000101, 2, "y")],
...     ("time", "id", "v2"))
>>> def asof_join(l, r):
...     return pd.merge_asof(l, r, on="time", by="id")
>>> df1.groupby("id").cogroup(df2.groupby("id")).applyInPandas(
...     asof_join, schema="time int, id int, v1 double, v2 string"
... ).show()  
+--------+---+---+---+
|    time| id| v1| v2|
+--------+---+---+---+
|20000101|  1|1.0|  x|
|20000102|  1|3.0|  x|
|20000101|  2|2.0|  y|
|20000102|  2|4.0|  y|
+--------+---+---+---+

或者,用户可以定义一个接受三个参数的函数。在这种情况下,分组键将作为第一个参数传递,数据将作为第二个和第三个参数传递。分组键将作为 numpy 数据类型的元组传递,例如 numpy.int32numpy.float64 。数据仍将作为两个 pandas.DataFrame 传入,其中包含原始 Spark DataFrames 中的所有列。

>>> def asof_join(k, l, r):
...     if k == (1,):
...         return pd.merge_asof(l, r, on="time", by="id")
...     else:
...         return pd.DataFrame(columns=['time', 'id', 'v1', 'v2'])
>>> df1.groupby("id").cogroup(df2.groupby("id")).applyInPandas(
...     asof_join, "time int, id int, v1 double, v2 string").show()  
+--------+---+---+---+
|    time| id| v1| v2|
+--------+---+---+---+
|20000101|  1|1.0|  x|
|20000102|  1|3.0|  x|
+--------+---+---+---+

相关用法


注:本文由纯净天空筛选整理自spark.apache.org大神的英文原创作品 pyspark.sql.PandasCogroupedOps.applyInPandas。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。