J'utilise Spark 1.6 en scala.Spark scala - Conversion StructType imbriquée en Map
J'ai créé un index dans ElasticSearch avec un objet. L'objet "params" a été créé en tant que Map [String, Map [String, String]]. Exemple:
val params : Map[String, Map[String, String]] = ("p1" -> ("p1_detail" -> "table1"), "p2" -> (("p2_detail" -> "table2"), ("p2_filter" -> "filter2")), "p3" -> ("p3_detail" -> "table3"))
Cela me donne des documents qui ressemblent à ce qui suit:
{
"_index": "x",
"_type": "1",
"_id": "xxxxxxxxxxxx",
"_score": 1,
"_timestamp": 1506537199650,
"_source": {
"a": "toto",
"b": "tata",
"c": "description",
"params": {
"p1": {
"p1_detail": "table1"
},
"p2": {
"p2_detail": "table2",
"p2_filter": "filter2"
},
"p3": {
"p3_detail": "table3"
}
}
}
},
Je suis en train de lire l'index ElasticSearch afin de mettre à jour les valeurs.
Spark lit l'index avec le schéma suivant:
|-- a: string (nullable = true)
|-- b: string (nullable = true)
|-- c: string (nullable = true)
|-- params: struct (nullable = true)
| |-- p1: struct (nullable = true)
| | |-- p1_detail: string (nullable = true)
| |-- p2: struct (nullable = true)
| | |-- p2_detail: string (nullable = true)
| | |-- p2_filter: string (nullable = true)
| |-- p3: struct (nullable = true)
| | |-- p3_detail: string (nullable = true)
Mon problème est que l'objet est lu comme un struct. Afin de gérer et de mettre à jour facilement les champs, je veux avoir une carte car je ne suis pas très familier avec StructType.
J'ai essayé d'obtenir l'objet dans une UDF comme une carte, mais je l'erreur suivante:
User class threw exception: org.apache.spark.sql.AnalysisException: cannot resolve 'UDF(params)' due to data type mismatch: argument 1 requires map<string,map<string,string>> type, however, 'params' is of struct<p1:struct<p1_detail:string>,p2:struct<p2_detail:string,p2_filter:string>,p3:struct<p3_detail:string>> type.;
Code UDF extrait:
val getSubField : Map[String, Map[String, String]] => String = (params : Map[String, Map[String, String]]) => { val return_string = (params ("p1") getOrElse("p1_detail", null.asInstanceOf[String]) return_string }
Ma question: Comment peut-on convertir cette structure à une carte? J'ai déjà lu vu la méthode toMap disponible dans la documentation mais ne trouve pas comment l'utiliser (pas très familier avec les paramètres implicites) comme je suis un débutant scala.
Merci à l'avance,
pouvez-vous s'il vous plaît ajouter UDF extrait de code? –
L'UDF ne va pas beaucoup aider car j'essaie juste d'obtenir une carte [String, Map [String, String]] où un Struct est attendu. –
'val getSubField: Carte [Chaîne, Carte [Chaîne, Chaîne]] => Chaîne = (paramètres: Carte [Chaîne, Carte [Chaîne, Chaîne]]) => { \t val return_string = (params (" p1 ") getOrElse ("p1_detail", null.asInstanceOf [String]) \t return_string } ' –