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