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?
ma question est différente parce que je ne peux pas utiliser le cas quand avec mon schéma –
le problème est que le cas où ne fonctionne pas pour moi –