列表未在“ foreach”语句中更新,返回空列表

时间:2019-07-26 02:32:54

标签: scala dataframe apache-spark foreach

我想创建一个数据框并使用foreach遍历每一行,然后foreach行,我创建一个名为newSample的对象,该对象由3个String组成,并将此newSample附加到一个名为SampleList。最后,我将得到一个newSample的列表,并使用spark toDF语句将该列表转换为新的数据框。

由于列表是不可变的,因此我也尝试使用ListBuffer而不是List

case class newSample(userID: String, featureName: String, featureValue: String)
var sampleList = List[newSample]()
// userFeatures is a list of strings, which are column names of df_short dataframe
// userID is a string, which is also the name a column of df_short    
   for (features <- userFeatures){
      val dfTemp = df_short.select(userID, features)
      dfTemp.foreach( Row =>{
        sampleList = newSample(Row.get(0).toString, features, Row.get(1).toString) :: sampleList
      })
      println(sampleList)
    }
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()
List()

打印的sampleList每次打印时都不应为空。但这是一个空列表。

1 个答案:

答案 0 :(得分:0)

List具有精美的flatMap函数,让您将列表的每个元素扩展为多个,最后将它们全部收集到一个列表中。这样,您无需使用任何可变的东西,无论是ListBuffer还是foreach方法。

    case class NewSample(userID: String, featureName: String, featureValue: String)
    val newSampleList = userFeatures.flatMap { feature =>
        df_short
          .select(userID, feature)
          .map(Row => NewSample(Row.get(0).toString, feature, Row.get(1).toString) :: sampleList)
          .collect()
          .toList
    }
相关问题