Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 循环火花数据帧_Scala_Apache Spark - Fatal编程技术网

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))