Spark dataframe exploser fonction
Quelqu'un peut-il expliquer pourquoi les cas Row
, Seq[Row]
sont utilisés après l'exploser d'un dataframe
champ de la collecte des éléments.
Et aussi pouvez-vous svp m'expliquer la raison pour laquelle asInstanceOf est nécessaire pour obtenir les valeurs de a explosé champ?
Voici la syntaxe:
val explodedDepartmentWithEmployeesDF = departmentWithEmployeesDF.explode(departmentWithEmployeesDF("employees")) {
case Row(employee: Seq[Row]) =>
employee.map(employee =>
Employee(employee(0).asInstanceOf[String],
employee(1).asInstanceOf[String], employee(2).asInstanceOf[String]) ) }
Vous devez vous connecter pour publier un commentaire.
D'abord je note, que je ne peux pas expliquer pourquoi votre
explode()
se transforme enRow(employee: Seq[Row])
que je ne connais pas le schéma de votre DataFrame. Je suppose qu'il a à faire avec la structure de vos données.Ne vous connaissant pas les données d'origine, j'ai créé un petit jeu de données pour des travaux de
Si j'ai maintenant une carte sur elle, vous pouvez voir qu'il renvoie les lignes contenant des données de type any.
Vous avez perdu les informations de type, qui est pourquoi vous devez spécifier explicitement le type lorsque vous souhaitez utiliser les données de la ligne
Donc, pour exploser, je dois faire la suite
Si vous voulez nommé colonnes, vous pouvez définir une classe de cas de vous tenir explosé données
Espère que cela apporte une certaine clearity.
Je pense que vous pouvez en savoir plus sur le document et faites un test au préalable.
exploser d'un dataframe encore de retour d'un dataframe.Et il accepte une fonction lambda f: (Ligne) ⇒ TraversableOnce[A] comme paramètre.
dans la fonction lambda, vous ferez correspondre l'entrée par cas. Vous avez déjà connu que votre contribution sera la Ligne de l'employé, qui est encore un Suivants de la Ligne.De sorte que le cas de l'entrée Ligne(employé: Seq[Ligne]) , si vous ne comprenez pas cette partie, vous pouvez apprendre plus de chose sur délettrer d'une fonction en scala.
Et que, employé(je crois que vous devriez utiliser employés ici), en tant que Seq de Ligne, s'appliquent à la carte en fonction de la carte chaque ligne à un Employé. Et vous pourrez utiliser la scala appliquer la fonction pour obtenir le i-ième valeur de cette ligne. Mais la valeur de retour est un Objet , vous devez utiliser des asInstanceOf pour le convertir dans le type que vous avez prévu.