【问题标题】:Why do SparkSQL UDF return a dataframe with columns names in the format UDF("Original Column Name")?为什么 SparkSQL UDF 返回列名格式为 UDF("Original Column Name") 的数据框?
【发布时间】:2018-03-25 20:00:12
【问题描述】:

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

stringModifierIterator 接收一个数据框并返回一个 List[Column]。然后可以像在命令 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() 时列名的样子

【问题讨论】:

  • 你能补充一下输出的样子吗(dataframe.show())?
  • 刚刚添加到我的问题的底部

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


【解决方案1】:

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

顺便说一句,这种方法可以更短更简单,无需递归:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    相关资源
    最近更新 更多