【发布时间】:2017-11-30 00:32:27
【问题描述】:
我有一个使用 DataFrame API 加载的 1GB csv 文件。我还实现了一个自定义的Transformer 来准备数据,以便Estimator 可以处理它。
transform 方法正在执行一些不同的操作:
- 铸造柱。
- 过滤行。
- 删除列。
- 创建对其他列应用函数的新列。
我担心此过程中的内存使用情况。如果在每次转换后将结果存储在变量中会发生什么?例如(简体):
override def transform(dataset: Dataset[_]): DataFrame = {
val df = dataset.withColumn("DayOfWeek", $"DayOfWeek".cast("int"))
val df2 = df1.filter($"Diverted" === 0)
val df3 = df2.drop(forbiddenVariables: _*)
val df4 = df3.withColumn("DepHour", hourExtractorUdf($"DepTime"))
val df5 = df4.select($"*", concat($"Origin", lit("-"), $"Dest").as("Route"))
df5
}
假设我这样做是为了在一个转换和另一个转换之间进行记录。
好的。第二种选择。如果我使用var 而不是val 会怎样?
override def transform(dataset: Dataset[_]): DataFrame = {
var df = dataset.withColumn("DayOfWeek", $"DayOfWeek".cast("int"))
df = df.filter($"Diverted" === 0)
df = df.drop(forbiddenVariables: _*)
df = df.withColumn("DepHour", hourExtractorUdf($"DepTime"))
df = df.select($"*", concat($"Origin", lit("-"), $"Dest").as("Route"))
df
}
我想现在在整个过程中我没有在内存中加载 5 个 DataFrame。对吧?
最后,下一个选项呢,它更节省内存吗?
override def transform(dataset: Dataset[_]): DataFrame = {
dataset.withColumn("DayOfWeek", $"DayOfWeek".cast("int"))
.filter($"Diverted" === 0)
.drop(forbiddenVariables: _*)
.withColumn("DepHour", hourExtractorUdf($"DepTime"))
.select($"*", concat($"Origin", lit("-"), $"Dest").as("Route"))
}
当然,我假设没有比其他选项的计算成本更高的选项了。
【问题讨论】:
标签: scala apache-spark spark-dataframe