Spark Scala中的动态映射语句

时间:2018-07-30 17:08:15

标签: scala apache-spark

在我的代码中,我将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试图将其构建为调用,但它不喜欢动态化

希望这很有道理!

0 个答案:

没有答案