L'explosion imbriquée Struct Spark dataframe
Je travaille par le biais de la Databricks exemple. Le schéma de la dataframe ressemble:
> parquetDF.printSchema
root
|-- department: struct (nullable = true)
| |-- id: string (nullable = true)
| |-- name: string (nullable = true)
|-- employees: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- firstName: string (nullable = true)
| | |-- lastName: string (nullable = true)
| | |-- email: string (nullable = true)
| | |-- salary: integer (nullable = true)
Dans l'exemple, ils montrent comment faire exploser les employés de la colonne en 4 colonnes supplémentaires:
val explodeDF = parquetDF.explode($"employees") {
case Row(employee: Seq[Row]) => employee.map{ employee =>
val firstName = employee(0).asInstanceOf[String]
val lastName = employee(1).asInstanceOf[String]
val email = employee(2).asInstanceOf[String]
val salary = employee(3).asInstanceOf[Int]
Employee(firstName, lastName, email, salary)
}
}.cache()
display(explodeDF)
Comment pourrais-je faire quelque chose de similaire avec le ministère de la colonne (c'est à dire ajouter deux colonnes supplémentaires pour le dataframe appelé "id" et "nom")? Les méthodes ne sont pas exactement les mêmes, et je ne peux que comprendre comment créer un nouveau bloc de données à l'aide de:
val explodeDF = parquetDF.select("department.id","department.name")
display(explodeDF)
Si j'essaie:
val explodeDF = parquetDF.explode($"department") {
case Row(dept: Seq[String]) => dept.map{dept =>
val id = dept(0)
val name = dept(1)
}
}.cache()
display(explodeDF)
- Je obtenir de l'avertissement et d'erreur:
<console>:38: warning: non-variable type argument String in type pattern Seq[String] is unchecked since it is eliminated by erasure
case Row(dept: Seq[String]) => dept.map{dept =>
^
<console>:37: error: inferred type arguments [Unit] do not conform to method explode's type parameter bounds [A <: Product]
val explodeDF = parquetDF.explode($"department") {
^
OriginalL'auteur Feynman27 | 2016-09-01
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser quelque chose comme ça:
qui vous a aidé à m'intégrer et à ces questions:
ne this aider? Il semble correspondre à tentative. Je pense que le problème avec ma réponse est que la
employees
a également un élément, tandis quedepartment
n'a pas.Ouais, le
employees
exemple crée de nouvelles lignes, alors que ledepartment
exemple ne devrait créer deux nouvelles colonnes.Bien sûr. Mise à jour de votre réponse que vous voyez l'ajustement.
Question connexe: stackoverflow.com/questions/30008127/...
OriginalL'auteur gsamaras
Cela semble fonctionner (mais peut-être pas la solution la plus élégante).
val explodeDF2 = explodeDF.withColumn("id", explodeDF("department.id")).withColumn("name", explodeDF2("department.name"))
OriginalL'auteur Feynman27