Scala 循环火花数据帧
我有一个数据帧Scala 循环火花数据帧,scala,apache-spark,Scala,Apache Spark,我有一个数据帧df,其中有一列groupID;也就是说,每个观察都属于一个特定的组。总共有8组。我想从每个groupID中抽取一定百分比的观察值(比如20%)。以下是我的做法: val sample_df = for ( i <- Array.range(0,7) ) yield { val sel_df = df.filter($"groupID"===i) sel_df.sample(false,0.2,seed1)
df
,其中有一列groupID
;也就是说,每个观察都属于一个特定的组。总共有8组。我想从每个groupID
中抽取一定百分比的观察值(比如20%)。以下是我的做法:
val sample_df = for ( i <- Array.range(0,7) ) yield {
val sel_df = df.filter($"groupID"===i)
sel_df.sample(false,0.2,seed1)
}
我在sample\u df
上应用了flatMap()
val flat_df = sample_df.flatMap(x => x)
<console>:59: error: type mismatch;
found: org.apache.spark.sql.DataFrame
required: scala.collection.GenTraversableOnce[?]
val flat\u df=sample\u df.flatMap(x=>x)
:59:错误:类型不匹配;
找到:org.apache.spark.sql.DataFrame
必需:scala.collection.GenTraversableOnce[?]
如何获取采样数据帧?据我所知,您正在尝试获取。为此,您只需拨打:
val行:RDD[Row]=sample_df.RDD
为了更好地解释错误,flatMap需要一些可遍历的东西,例如,但您只提供了一个
此外,要向驱动程序获取所有数据,您可以调用:
val行:数组[Row]=sample\u df.collect
我想你应该在每组中均匀取样
sample_df.reduceLeft((result, df) => result.unionAll(df))
在我看来,你只是想对整个数据帧进行20%的采样?如果是这样,那么就没有理由创建8个不同的数据帧,然后将它们合并回来
df.样本(假,0.2,种子)
我会成功的。如果您想对每个groupID进行不同的分数,请查看df.stat.sampleBy
。如果要确保样本中每个类的准确率为20%,则必须转换为PairRDD并使用分层抽样,如:
df.rdd.map(row=>(row(groupIDIndex),row)).sampleByKeyExact(false,map(0->0.2,1->0.2,…,8->0.2),seed)
您好,感谢您的回复。不幸的是,sample_df
是数据帧(org.apache.spark.sql.DataFrame
)和.rdd
方法的数组集合。我需要的是将这个数组集合扁平化为数据帧。这就是为什么我首先应用了flatMap
。对,很抱歉。那么Rockie Yang的答案是正确的。
sample_df.reduceLeft((result, df) => result.unionAll(df))