我想创建一个数据框并使用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
每次打印时都不应为空。但这是一个空列表。
答案 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
}