2017-10-20 34 views
1

J'ai un Dataframe que j'essaie d'aplatir. Dans le cadre du processus, je veux l'exploser, donc si j'ai une colonne de tableaux, chaque valeur du tableau sera utilisée pour créer une ligne séparée. Je sais que je peux utiliser la fonction exploser. Mais, j'ai un problème, la colonne contient une valeur nulle et j'utilise spark 1.6. Voici un exemple du type de données et ce que je veux:
Mes données:Spark 1.6 explose avec des valeurs nulles

id | ListOfRficAction| RficActionAttachment 
_______________________________ 
1 | Luke   | [baseball, soccer] 
2 | Lucy   | null 

et je veux

id | ListOfRficAction| RficActionAttachment 
_______________________________ 
1 | Luke   | baseball 
1 | Luke   | soccer 
2 | Lucy   | null 

J'utilise Spark 1.6 (donc je ne peux pas utiliser la fonction explode_outer) et j'essayer d'utiliser exploser mais j'ai l'erreur suivante:

scala.MatchError: [null] (of class org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema) 

i essayez aussi:

df.withColumn("likes", explode(
    when(col("likes").isNotNull, col("likes")) 
    // If null explode an array<string> with a single null 
    .otherwise(array(lit(null).cast("string"))))) 

mais mon schéma DataFrame est très complexe (j'ai string et long), donc la fonction cast ne fonctionne pas. Voici une partie de mon schéma et l'erreur j'ai:

|-- RficActionAttachment: array (nullable = true) 
| |-- element: struct (containsNull = true) 
| | |-- ActivityFileAutoUpdFlg: string (nullable = true) 
| | |-- ActivityFileDate: string (nullable = true) 
| | |-- ActivityFileDeferFlg: string (nullable = true) 
| | |-- ActivityFileDockReqFlg: string (nullable = true) 
| | |-- ActivityFileDockStatFlg: string (nullable = true) 
| | |-- ActivityFileExt: string (nullable = true) 
| | |-- ActivityFileName: string (nullable = true) 
| | |-- ActivityFileRev: string (nullable = true) 
| | |-- ActivityFileSize: long (nullable = true) 
| | |-- ActivityFileSrcPath: string (nullable = true) 
| | |-- ActivityFileSrcType: string (nullable = true) 
| | |-- ActivityId: string (nullable = true) 
| | |-- AttachmentId: string (nullable = true) 
| | |-- Comment: string (nullable = true) 

classe utilisateur a jeté exception:

org.apache.spark.sql.AnalysisException: cannot resolve 'CASE WHEN isnotnull(ListOfRficAction.RficAction.ListOfRficActionAttachment.RficActionAttachment) THEN ListOfRficAction.RficAction.ListOfRficActionAttachment.RficActionAttachment ELSE array(ListOfRficAction.RficAction.ListOfRficActionAttachment.RficActionAttachment)' 

en raison de non-concordance de type de données: THEN et ELSE expressions doivent tous être le même type ou coercible un type commun;

Vous avez une idée de ce que je peux faire?

+0

ma question est différente parce que je ne peux pas utiliser le cas quand avec mon schéma –

+0

le problème est que le cas où ne fonctionne pas pour moi –

Répondre

1

Remplacez d'abord toutes les valeurs null dans la colonne array(null), puis utilisez explode. En utilisant l'exemple dataframe dans la question:

val df = Seq((1, "Luke", Array("baseball", "soccer")), (2, "Lucy", null)) 
    .toDF("id", "ListOfRficAction", "RficActionAttachment") 

df.withColumn("RficActionAttachment", 
    when($"RficActionAttachment".isNull, array(lit(null))) 
    .otherwise($"RficActionAttachment")) 
    .withColumn("RficActionAttachment", explode($"RficActionAttachment")) 

Cela donnera le résultat demandé:

+---+----------------+--------------------+ 
| id|ListOfRficAction|RficActionAttachment| 
+---+----------------+--------------------+ 
| 1|   Luke|   baseball| 
| 1|   Luke|    soccer| 
| 2|   Lucy|    null| 
+---+----------------+--------------------+ 
+0

vous répondez @Shaido pour la réponse mais comme je l'ai dit j'essaye ceci et j'ai toujours la même erreur: ne peut pas résoudre 'CAS QUAND isnull (ListOfRficAction.RficAction.ListOfRficActionAttachment.RficActionAttachment) THEN tableau (null) ELSE ListOfRficAction .RficAction.ListOfRficActionAttachment.RficActionAttachment 'Peut-être à cause de mon schéma de données –

+0

@MbulaGuyMarcel le schéma dataframe ne devrait pas importer, ce qui précède devrait fonctionner si vous avez un tableau. Faites une petite mise à jour du code, pouvez-vous réessayer? – Shaido

+0

suis désolé, cela ne fonctionne pas –