Scala 如何在Spark中为Dataset实现Seq.grouped(size:Int):Seq[Seq[A]]
我想尝试实现Scala 如何在Spark中为Dataset实现Seq.grouped(size:Int):Seq[Seq[A]],scala,apache-spark,Scala,Apache Spark,我想尝试实现 def-grouped(size:Int):迭代器[Repr],该迭代器在Spark中为数据集所用 因此,输入应该是ds:Dataset[A],size:Int和输出Seq[Dataset[A],其中输出中的Dataset[A]每个都不能大于size 我应该如何进行?我尝试了重新分区和映射分区,但我不确定从那里走到哪里 多谢各位 编辑:我在RDD中找到了glom方法,但它产生了一个RDD[Array[a]]我如何从这个方向转到另一个方向Array[RDD[a]] 这是我找到的解决方
def-grouped(size:Int):迭代器[Repr]
,该迭代器在Spark中为数据集
所用
因此,输入应该是ds:Dataset[A],size:Int
和输出Seq[Dataset[A]
,其中输出中的Dataset[A]
每个都不能大于size
我应该如何进行?我尝试了重新分区
和映射分区
,但我不确定从那里走到哪里
多谢各位
编辑:我在
RDD
中找到了glom
方法,但它产生了一个RDD[Array[a]]
我如何从这个方向转到另一个方向Array[RDD[a]]
这是我找到的解决方案,但我不确定它是否能可靠工作:
override protected def batch[A](
input: Dataset[A],
batchSize: Int
): Seq[Dataset[A]] = {
val count = input.count()
val partitionQuantity = Math.ceil(count / batchSize).toInt
input.randomSplit(Array.fill(partitionQuantity)(1.0 / partitionQuantity), seed = 0)
}
给你,你想要的东西
/*
{"countries":"pp1"}
{"countries":"pp2"}
{"countries":"pp3"}
{"countries":"pp4"}
{"countries":"pp5"}
{"countries":"pp6"}
{"countries":"pp7"}
*/
import org.apache.spark.rdd.RDD
import org.apache.spark.sql._
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._
import org.apache.spark.{SparkConf, SparkContext};
object SparkApp extends App {
override def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("Simple Application").setMaster("local").set("spark.ui.enabled", "false")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val dataFrame: DataFrame = sqlContext.read.json("/data.json")
val k = 3
val windowSpec = Window.partitionBy("grouped").orderBy("countries")
val newDF = dataFrame.withColumn("grouped", lit("grouping"))
var latestDF = newDF.withColumn("row", row_number() over windowSpec)
val totalCount = latestDF.count()
var lowLimit = 0
var highLimit = lowLimit + k
while(lowLimit < totalCount){
latestDF.where(s"row <= $highLimit and row > $lowLimit").show(false)
lowLimit = lowLimit + k
highLimit = highLimit + k
}
}
}
/*
{“国家”:“pp1”}
{“国家”:“pp2”}
{“国家”:“pp3”}
{“国家”:“pp4”}
{“国家”:“pp5”}
{“国家”:“pp6”}
{“国家”:“第7页”}
*/
导入org.apache.spark.rdd.rdd
导入org.apache.spark.sql_
导入org.apache.spark.sql.expressions.Window
导入org.apache.spark.sql.functions_
导入org.apache.spark.{SparkConf,SparkContext};
对象SparkApp扩展应用程序{
覆盖def main(参数:数组[字符串]):单位={
val conf=new SparkConf().setAppName(“简单应用程序”).setMaster(“本地”).set(“spark.ui.enabled”、“false”)
val sc=新的SparkContext(配置)
val sqlContext=新的sqlContext(sc)
val dataFrame:dataFrame=sqlContext.read.json(“/data.json”)
val k=3
val windowSpec=Window.partitionBy(“分组”).orderBy(“国家”)
val newDF=dataFrame.withColumn(“分组”),lit(“分组”)
var latestDF=newDF.withColumn(“行”,windowSpec上的行号())
val totalCount=latestDF.count()
var下限=0
var上限=下限+k
while(下限<总计数){
latestDF.where(s“row$lowLimit”).show(false)
下限=下限+k
上限=上限+k
}
}
}
正如您所怀疑的,它不可靠。randomSplit不保证批大小相等,因此将有批大于给定大小。