在我的代码中,我将DF更改为RDD以通过映射调用运行函数。每次运行都会有几秒钟的开销,因此,如果我这样运行函数调用:
var iterator = 1
val inputDF = spark.sql("select * from DF")
var columnPosition = Array("Column_4")
columnPosition = columnPosition ++ Array("Column_9")
var selectedDF = inputDF
var intrimDF = inputDF
var finalDF = inputDF
val inputDF = spark.sql("select * from DF")
while(iterator <= columnPosition.length) {
selectedDF=finalDF.selectExpr("foreign_key",columnPosition(iterator))
intrimDF = selectedDF.rdd.map(x => (x(0),action(x(1)))).toDF.selectExpr("_1 as some_key","_2 as " columnPosition(iterator)).joinBack.changeColumnPositions.dropOriginalColumn.renameColumns
finalDF=intrimDF
iterator = iterator + 1
}
由于加入,对于大型任务,它运行约90秒。我想做的是像下面这样构建它,以完全消除连接并保持动态。
val inputDF = spark.sql("select * from DF")
val intrimDF = inputDF.rdd.map(x=>(x(0),x(1),x(2),action(x(3)),x(4),x(5),x(6),x(7),action(x(8))))
val columnStatement//Create an Array with columnName changes
val finalDF = intrimDF.selectExpr(columnStatement :_*)
问题是我无法克服硬编码方面的问题,下面是我想通过动态设置映射调用尝试执行的示例。
val mappingStatement = "x=>(x(0),x(1),x(2),action(x(3)),x(4),x(5),x(6),x(7),action(x(8)))"
val intrimDF = inputDF.rdd.map(mappingStatement)
我尝试过的所有方法都失败了: 1使用Map()函数进行调用 2设置一个数组并将其传递为:_ * 3试图将其构建为调用,但它不喜欢动态化
希望这很有道理!