在我的 spark 工作中,我必须对 2 个用例的多列进行转换:
- 铸柱
在我的个人用例中,我在 150 列的 Df 上使用它
def castColumns(inputDf: DataFrame, columnsDefs: Array[(String, DataType)]): DataFrame = {
columnsDefs.foldLeft(inputDf) {
(acc, col) => acc.withColumn(col._1, inputDf(col._1).cast(col._2))
}
}
- 转型
在我的个人用例中,我使用它来执行计算 n 多列以创建 n 新列(1 个输入列用于 1 个输出列,n 次)
ListOfCol.foldLeft(dataFrame) {
(tmpDf, m) =>
tmpDf.withColumn(addSuffixToCol(m), UDF(m))
}
如您所见,我使用 FoldLeft 方法和 withColumn。但是我最近在文档中发现,多次使用withColumn并不是那么好:
此方法在内部引入了投影。因此,多次调用它,例如,通过循环以添加多个列可能会生成大计划,这可能会导致性能问题甚至 StackOverflowException。为避免这种情况,请同时对多列使用 select。
我还发现foldleft减速会激发应用程序,因为每次迭代都会执行完整的计划分析。我认为这是真的,因为我在代码中添加了 foldleft,我的 spark 开始工作需要比以前更多的时间。
在多列上应用转换时有好的做法吗?
Spark 版本:2.2 语言:Scala