0

所以我运行下面的代码后得到的数据框恰好是我想要的。它与原始数据框相同,但所有包含纯数字数据的单元格都删除了所有的括号和斜线(括号在前面用负号替换)。为什么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() image

+0

你可以添加如何输出('dataframe.show())'? – Shaido

+0

刚刚添加到我的问题的底部 – suleydaman

回答

2

您可以通过使用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)) 
}