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を使用して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)) 
} 
関連する問題