为什么SparkSQL UDF返回一个带有UDF格式的列名的数据帧(“原始列名”)?

时间:2017-10-13 16:13:22

标签: scala apache-spark dataframe apache-spark-sql user-defined-functions

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

stringModifierIterator接受数据帧并返回List [Column]。然后可以像命令dataframe.select(List[Column]: _*)一样使用List [Column]来创建新的数据帧。

不幸的是,列名已被改为UDF(“原始列名”),我无法弄清楚原因。

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()时列名的样子 image

1 个答案:

答案 0 :(得分:2)

您可以使用stringModifierIteratorColumn.as中使用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)
  }
}
BTW,这种方法可以更简单,更简单,无需递归:

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