Python pyspark UDF返回AttributeError:';数据帧';对象没有属性';排序u值';

Python pyspark UDF返回AttributeError:';数据帧';对象没有属性';排序u值';,python,pandas,apache-spark,pyspark,Python,Pandas,Apache Spark,Pyspark,我有一个艰难的时间与我的程序,我试图应用一个自定义项到一个数据帧,并得到一个错误消息根据我的标题。这是我的密码 import pandas as pd import datetime as dt import numpy as np from pyspark.sql.functions import udf from pyspark.sql.types import StringType df = pd.DataFrame({ 'ID':[1,2,2],

我有一个艰难的时间与我的程序,我试图应用一个自定义项到一个数据帧,并得到一个错误消息根据我的标题。这是我的密码

import pandas as pd
import datetime as dt
import numpy as np
from pyspark.sql.functions import udf
from pyspark.sql.types import StringType

df = pd.DataFrame({
              'ID':[1,2,2],
              'dt':[pd.Timestamp.now(),pd.Timestamp.now(),
                  pd.Timestamp.now()]})
df.head()

def FlagUsers(df,ids,tm,gap):
  df=df.sort_values([ids,tm])
  df[ids]=df[ids].astype(str)
  df['timediff'] = df.groupby(ids)[tm].diff()
  df['prevtime']= df.groupby (ids)[tm].shift()
  df['prevuser']= df[ids].shift()
  df['prevuser'].fillna(0,inplace=True)
  df['timediff']=df.timediff/ pd.Timedelta('1 minute')
  df['timediff'].fillna(99,inplace=True)
  df['flagnew']=np.where((df.timediff<gap) & (df['prevuser']==df[ids]),'existing','new' )
  df.loc[df.flagnew == 'new','sessnum'] = df.groupby([ids,'flagnew']).cumcount()+1
  df['sessnum']=df['sessnum'].fillna(method='ffill')
  df['session_key']= df[ids].astype(str)+"_"+df['sessnum'].astype(str)
  df.drop(['prevtime', 'prevuser'], axis =1, inplace= True)
  arr=df['session_key'].values
  return arr

# Python Function works fine:
FlagUsers(df,'ID','dt',5)


s_df = spark.createDataFrame(df)
s_df.show()

spark.udf.register("FlagUsers", FlagUsers)
s_df = s_df.withColumn('session_key',FlagUsers(s_df,'ID','dt',5))

将熊猫作为pd导入
将日期时间导入为dt
将numpy作为np导入
从pyspark.sql.functions导入udf
从pyspark.sql.types导入StringType
df=pd.DataFrame({
“ID”:[1,2,2],
'dt':[pd.Timestamp.now(),pd.Timestamp.now(),
pd.Timestamp.now()]})
df.head()
def标志用户(df、ids、tm、gap):
df=df.sort_值([ids,tm])
df[ids]=df[ids].astype(str)
df['timediff']=df.groupby(ids)[tm].diff()
df['prevtime']=df.groupby(ids)[tm].shift()
df['prevuser']=df[id].shift()
df['prevuser'].fillna(0,inplace=True)
df['timediff']=df.timediff/pd.Timedelta('1分钟')
df['timediff'].fillna(99,inplace=True)

df['flagnew']=np.where((df.timediff在udf中,您无法访问数据帧或执行分组操作。udf只在一行上运行。您应该尝试将udf转换为数据帧调用。谢谢您的回复。我对此有点陌生,您知道关于这个特定问题我能读到什么好的来源吗?您可以看看met一个好的方法是把问题想得更像SQL任务,而不是数据帧任务。