为什么SparkSQL UDF以UDF格式(“原始列名称”)的格式返回列名称的数据框?
问题描述:
所以我运行下面的代码后得到的数据框恰好是我想要的。它与原始数据框相同,但所有包含纯数字数据的单元格都删除了所有的括号和斜线(括号在前面用负号替换)。为什么SparkSQL UDF以UDF格式(“原始列名称”)的格式返回列名称的数据框?
stringModifierIterator接受一个数据框并返回一个List [Column]。 List [Column]可以像命令dataframe.select(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()
答
您可以通过使用Column.as
明确指定你用UDF创建列在stringModifierIterator
解决这个问题:
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))
}
你可以添加如何输出('dataframe.show())'? – Shaido
刚刚添加到我的问题的底部 – suleydaman