过滤scala中的数据帧

时间:2016-09-06 10:15:23

标签: scala apache-spark

假设我有一个使用案例类架构从文本文件创建的数据框。以下是存储在数据帧中的数据。

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

1 个答案:

答案 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,稍后你可以对它运行计算。