假设我有一个使用案例类架构从文本文件创建的数据框。以下是存储在数据帧中的数据。
id - Type-qt - P
1,X,10,100.0
2,Y,20,200.0
1,Y,15,150.0
1,X,5,120.0
我需要按“id”和Type过滤数据。并且对于每个“id”迭代数据帧进行一些计算。 我试过这种方式,但它没有用。代码快照。
case class MyClass(id: Int, type: String, qt: Long, PRICE: Double)
val df = sc.textFile("xyz.txt")
.map(_.split(","))
.map(p => MyClass(p(0).trim.toInt, p(1), p(2).trim.toLong, p(3).trim.toDouble)
.toDF().cache()
val productList: List[Int] = df.map{row => row.getInt(0)}.distinct.collect.toList
val xList: List[RDD[MyClass]] = productList.map {
productId => df.filter({ item: MyClass => (item.id== productId) && (item.type == "X" })}.toList
val yList: List[RDD[MyClass]] = productList.map {
productId => df.filter({ item: MyClass => (item.id== productId) && (item.type == "Y" })}.toList
答案 0 :(得分:0)
从您的示例中获取独特的想法,只需迭代所有ID并根据当前ID过滤DataFrame。在此之后,您有一个仅包含相关数据的DataFrame:
val df3 = sc.textFile("src/main/resources/importantStuff.txt") //Your data here
.map(_.split(","))
.map(p => MyClass(p(0).trim.toInt, p(1), p(2).trim.toLong, p(3).trim.toDouble)).toDF().cache()
val productList: List[Int] = df3.map{row => row.getInt(0)}.distinct.collect.toList
println(productList)
productList.foreach(id => {
val sqlDF = df3.filter(df3("id") === id)
sqlDF.show()
})
循环中的sqlDF是带有相关数据的DF,稍后你可以对它运行计算。