【发布时间】:2016-03-25 05:41:25
【问题描述】:
我试图在循环中向 Scala ListBuffer 添加一些对象,但每次添加一个对象时,它都会在循环的下一次迭代中消失。
当我在添加新条目之前和之后打印 ListBuffer 的内容时,我得到以下输出:
添加前:ListBuffer()
添加后:ListBuffer(com.me.FeatureV2@20d953ba)
添加前:ListBuffer()
添加后:ListBuffer(com.me.FeatureV2@6b768ce7)
添加前:ListBuffer()
添加后:ListBuffer(com.me.FeatureV2@123f42d5)
代码:
def generateStatistics(df: DataFrame): List[FeatureV2] = {
var features = ListBuffer[FeatureV2]()
val dataColumn = "data"
for (field <- df.schema.fieldNames){
val columnType: String = df.select(field).dtypes(0)._2
if (columnType == StringType.toString){
val statsDf: DataFrame = getStats(df, field, dataColumn)
for (row <- statsDf){
println("Before add: " + features)
val feature = new FeatureV2()
feature.element = row.getString(0)
feature.count = row.getLong(1)
feature.sum = row.getDouble(2)
feature.max = row.getDouble(3)
feature.min = row.getDouble(4)
feature.feature = field
features += feature
println("After add: " + features)
}
}
}
features.toList
}
但有时,我会得到以下信息:
添加前:ListBuffer()
添加后:ListBuffer(com.me.FeatureV2@1433183c)
添加前:ListBuffer(com.me.FeatureV2@1433183c)
添加后:ListBuffer(com.me.FeatureV2@1433183c, com.me.FeatureV2@4b0df9e5)
添加前:ListBuffer()
添加后:ListBuffer(com.me.FeatureV2@1e201b19)
看起来它实际上正在填充 ListBuffer,但它正在被清除。与垃圾收集有关吗?
【问题讨论】:
-
你确定你只给
generateStatistics打电话一次吗? -
@JeanLogeart 是的,当然。
-
附带说明,请使用 ListBuffer 作为 val 并使用 += (see here) 附加到它。这很奇怪,而且很难推理,因为您正在修改对象引用。
标签: scala apache-spark