グループごとにPysparkデータフレームの各行に関数を適用するには、data.groupby.apply()を使用します。
グループ化されたマップPandas UDF]を使用しました。ただし、私の関数に別の引数を追加する方法を理解することはできません。
私はグローバル変数として引数を使ってみましたが、関数はそれを再コンピネーションにしません(my引数はPyspark DataFrameです)
[。]私はまた、この質問で提案されている解決策を試みました(pandasデータフレーム) Pandas groupby()+ apply())引数を使って
@pandas_udf(schema,PandasUDFType.GROUPED_MAP)
def function(key,data, interval):
interval_df=interval.filter(interval["var"]==key).toPandas()
for value in interval_df:
#Apply some operations
return Data.groupBy("msn").apply(calc_diff, ('arg1'))
_
または
@pandas_udf(schema,PandasUDFType.GROUPED_MAP)
def function(key,data, interval):
interval_df=interval.filter(interval["var"]==key).toPandas()
for value in interval_df:
#Apply some operations
return Data.groupBy("msn").apply(lambda x: calc_diff(x,'arg1'))
_
しかし、私はエラーを受けます:
ValueError:無効な機能:関数型を持つPANDAS_UDFS GROUPED_MAPは、引数(データ)または2つの引数(キー、データ)のいずれかを取ります。
上記の問題で誰かが私を助けてくれることができました。
ありがとう
私はあなたがこのようなことをすることができると思います
def myfun(data, key, interval):
#Apply some operations
return something
@pandas_udf(schema, PandasUDFType.GROUPED_MAP)
def myfun_udf(data):
return myfun(data=data, key=mykey, interval=myinterval)
mykey=1
myinterval=2
Data.groupBy("msn").apply(myfun_udf)
_
私は@ hwrdのアイデアが好きですが、代わりに、@ Fengの例のように統合することをより簡単にするためにそれを発電機のパターンにするでしょう。
def function_generator(key):
@pandas_udf(schema,PandasUDFType.GROUPED_MAP)
def function(interval):
interval_df=interval.filter(interval["var"]==key).toPandas()
for value in interval_df:
#Apply some operations
return function
calc_diff = function_generator('arg1')
output = Data.groupBy("msn").apply(calc_diff)
_