Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 为什么SparkSQL UDF返回的数据帧的列名格式为UDF(“原始列名”)?_Scala_Apache Spark_Dataframe_Apache Spark Sql_User Defined Functions - Fatal编程技术网

Scala 为什么SparkSQL UDF返回的数据帧的列名格式为UDF(“原始列名”)?

Scala 为什么SparkSQL UDF返回的数据帧的列名格式为UDF(“原始列名”)?,scala,apache-spark,dataframe,apache-spark-sql,user-defined-functions,Scala,Apache Spark,Dataframe,Apache Spark Sql,User Defined Functions,因此,运行以下代码后得到的数据帧正是我想要的。它与原始数据框相同,但所有包含纯数字数据的单元格都已删除所有括号和斜杠(括号前面用减号替换) stringModifierIterator接收数据帧并返回列表[列]。然后可以像在命令dataframe中一样使用List[Column]。选择(List[Column]:*)创建新的数据帧 不幸的是,列名被改成了类似于UDF(“原始列名”)的东西,我不知道为什么 def stringModifierIterator(dataFrame: DataFram

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

stringModifierIterator接收数据帧并返回列表[列]。然后可以像在命令
dataframe中一样使用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()时列名的样子

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

您可以通过使用
Column显式命名在
stringModifierIterator
中使用UDF创建的列来解决此问题。as

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())
?刚刚把它添加到我问题的底部你能添加输出的样子吗(
dataframe.show())
?刚刚把它添加到我问题的底部