根据ID列,通过保留顺序将Spark DataFrame分为两个DataFrame(70%和30%)

时间:2018-10-23 21:41:43

标签: apache-spark pyspark apache-spark-2.0

我有一个类似的火花数据框

id  start_time   feature
1   01-01-2018   3.567
1   01-02-2018   4.454
1   01-03-2018   6.455
2   01-02-2018   343.4
2   01-08-2018   45.4
3   02-04-2018   43.56
3   02-07-2018   34.56
3   03-07-2018   23.6

我希望能够根据 id列将其分为两个数据帧。因此,我应该对id列进行分组,按start_time排序,并将70%的行分成一个数据帧和30个数据帧通过保留顺序将行的%放入另一个数据框中。结果应如下所示:

Dataframe1:
id  start_time   feature
1   01-01-2018   3.567
1   01-02-2018   4.454
2   01-02-2018   343.4
3   02-04-2018   43.56
3   02-07-2018   34.56

Dataframe2:
1   01-03-2018   6.455
2   01-08-2018   45.4
3   03-07-2018   23.6

我正在使用Spark 2.0和python。实现此目的的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我要做的方法是创建两个窗口:

w1 =  Window.partitionBy(df.id).orderBy(df.start_time)
w2 =  Window.partitionBy(df.id)

df = df.withColumn("row_number",F.row_number().over(w1))\
                     .withColumn("count",F.count("id").over(w2))\
                     .withColumn("percent",(F.col("row_number")/F.col("count")))
train = df.filter(df.percent<=0.70)
test = df.filter(df.percent>0.70)