因此,运行以下代码后得到的数据帧正是我想要的。它与原始数据帧相同,但所有具有纯数字数据的单元格都删除了所有括号和斜杠(括号在前面替换为减号)。
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()时列名的样子
答案 0 :(得分:2)
您可以使用stringModifierIterator
在Column.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))
}