为什么 SparkSQL UDF return 数据框的列名格式为 UDF("Original Column Name")?

Why do SparkSQL UDF return a dataframe with columns names in the format UDF("Original Column Name")?

所以我在 运行 之后得到的数据帧正是我想要的。它与原始数据框相同,但所有具有纯数字数据的单元格都已删除所有括号和斜杠(括号在前面用减号代替)。

stringModifierIterator 接受一个数据框和 returns 一个列表[列]。然后可以像在命令 dataframe.select(List[Column]: _*) 中一样使用 List[Column] 来创建一个新的数据框。

不幸的是,列名已更改为 UDF("Original Column Name") 之类的名称,我不明白为什么。

def stringModifierIterator(dataFrame: DataFrame, dataFrameColumns: Array[String], uDF: UserDefinedFunction): List[Column] ={
      if(dataFrameColumns.isEmpty){
        Nil
      } else {
        uDF(dataFrame(dataFrameColumns.head)) :: stringModifierIterator(dataFrame, dataFrameColumns.tail, uDF)
      }
    }

val stringModifierFunction: (String => String) = { s: String => Option(s).map(modifier).getOrElse("0") }

def modifier(inputString: String): String = {
  ???
}

这是我使用 df.show() 时列名的样子

您可以通过使用 Column.as:

stringModifierIterator 中明确命名您使用 UDF 创建的列来解决此问题
def stringModifierIterator(dataFrame: DataFrame, dataFrameColumns: Array[String], uDF: UserDefinedFunction): List[Column] ={
  if(dataFrameColumns.isEmpty){
    Nil
  } else {
    val col = dataFrameColumns.head
    uDF(dataFrame(col)).as(col) :: stringModifierIterator(dataFrame, dataFrameColumns.tail, uDF)
  }
}

顺便说一句,如果没有递归,这个方法可以更短更简单:

def stringModifierIterator(dataFrame: DataFrame, dataFrameColumns: Array[String], uDF: UserDefinedFunction): List[Column] ={
  dataFrameColumns.toList.map(col => uDF(dataFrame(col)).as(col))
}