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


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。