0

Ainsi, l'image que je reçois après l'exécution du code suivant correspond exactement à ce que je veux. Il s'agit de la même image que l'original, mais toutes les cellules avec des données purement numériques ont été supprimées (les parenthèses sont remplacées par un signe moins à l'avant). StringModifierIterator accepte une structure de données et renvoie une liste [colonne]. La List [Column] peut alors être utilisée comme dans la commande dataframe.select (Liste [Column]: _ *) pour créer une nouvelle dataframe.Pourquoi SparkSQL UDF renvoie-t-il une structure de données avec des noms de colonne au format UDF ("Nom de colonne d'origine")?

Malheureusement, les noms de colonne ont été modifiés à quelque chose comme UDF ("Original Column Name") et je ne peux pas comprendre pourquoi.

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 = { 
    ??? 
} 

C'est ce que les noms de colonnes ressemblent quand je l'utilise df.show() image

+0

Pouvez-vous ajouter à quoi ressemble la sortie ('dataframe.show())'? – Shaido

+0

Je viens d'ajouter cela au bas de ma question – suleydaman

Répondre

2

Vous pouvez résoudre ce problème en nommant explicitement les colonnes que vous créez avec l'UDF à l'aide stringModifierIteratorColumn.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) 
    } 
} 

BTW, cette méthode peut être beaucoup plus courte et plus simple sans récursion:

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