如何在 Pyspark 中使用 @pandas_udf return 多个数据帧?

How to return multiple dataframes using @pandas_udf in Pyspark?

我想为 Pyspark 创建 sklearn 的 train_test_split 函数。我正在使用 pandas udf 创建此函数

这就是我所做的。

@pandas_udf(schema, PandasUDFType.GROUPED_MAP)
def load_dataset(dataset):
    
    feature_columns = cols
    label = 'y';
    X = dataset[feature_columns]
    Y = dataset[label]
 
    # splitting the dataset into train and test
    X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)
    print(X_train)
 
    return X_train, X_test, y_train, y_test 

我想要这些数据帧X_train、X_test、y_train、y_test。

我知道udf函数是这样调用的

df.groupby("key").apply(load_dataset).show()

但我不知道用什么代替 key 另外,这个 returns 单个数据框,我想要四个。

有什么问题:

df = inputDF.cache()
a,b = df.randomSplit([0.5, 0.5])

对于顺序重要的时间序列,使用:

df = df.withColumn("rank", percent_rank().over(Window.partitionBy().orderBy("departure_time")))

train_df = df.where("rank <= .8").drop("rank", "departure_time")

实际上我必须进行子采样。这就是为什么我必须从 train_test_split 函数中获取四个变量 returns 的原因。但是我连接了 X_test 和 y_test 并返回了一个数据帧。

@pandas_udf(schema, PandasUDFType.GROUPED_MAP)
def load_dataset(dataset):
    
    feature_columns = cols
    label = 'y';
    X = dataset[feature_columns]
    Y = dataset[label]
 
    # splitting the dataset into train and test
    X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)
    print(X_train)
    
    df_sample = pd.concat([X_test, y_test], axis=1)
 
    return df_sample

这段代码对我有用。