/ / Le paramètre some_case_class de Scala n'est pas membre de l'option [some_case_class] - scala, apache-spark, case-class

Le paramètre Scala some_case_class n'est pas membre de l'option [some_case_class] - scala, apache-spark, case-class

J'essaie de réécrire ce script https://www.kaggle.com/paulantoine/light-gbm-benchmark-0-3692/code à Scala, et doivent prendre des informations de deux classes de cas et les mettre en une seule. Les classes de donateurs sont:

case class Prods1(product_name: String, aisle_id: Int, department_id: Int)
case class Prods2(orders: Int, reorders: Int)

après avoir rejoint, ils ressemblent à ceci:

(Int, (Prods1, Option[Prods2]))

alors je dois les convertir en:

case class Product(product_id: Int, product_name: String, aisle_id: Int, department_id: Int, orders: Option[Int], reorders: Option[Int])

cela se fait par la fonction suivante:

def parse_products(product_data: (Int, (Prods1Data, Option[Prods2Data]))) = {
val product_id = product_data._1
val product_name = product_data._2._1.product_name
val aisle_id = product_data._2._1.aisle_id
val department_id = product_data._2._1.department_id
var orders = None
var reorders = None
if(product_data._2._2.isDefined){
val p2 = product_data._2._2
orders = p2.orders
reorders = p2.reorders
}
Product(product_id, product_name, aisle_id, department_id, orders, reorders)
}

Je reçois des erreurs suivantes:

error: value orders is not a member of Option[Prods2]
orders = p2.orders
^
error: value reorders is not a member of Option[Prods2]
reorders = p2.reorders
^

J'ai également essayé une autre option:

def parse_products(product_data: (Int, (Prods1, Option[Prods2]))) = {
val product_id = product_data._1
val product_name = product_data._2._1.product_name
val aisle_id = product_data._2._1.aisle_id
val department_id = product_data._2._1.department_id
product_data._2._2 match {
case Some(p2) => {
val orders = p2.orders
val reorders = p2.reorders
}
case None => {
val orders = None
val reorders = None
}
}
Product(product_id, product_name, aisle_id, department_id, orders, reorders, reorder_ratio)
}

De cette façon, j'obtiens une autre erreur:

error: not found: value orders
Product(product_id, product_name, aisle_id, department_id, orders, reorders)
^
error: not found: value reorders
Product(product_id, product_name, aisle_id, department_id, orders, reorders)
^

Si vous le trouvez, veuillez corriger les deux options, car je fais cela pour apprendre et les deux constructions me seraient vraiment utiles, merci d'avance.

Réponses:

0 pour la réponse № 1

Vous pouvez renvoyer un tuple depuis le match et attribuer à deux variables distinctes, il rend le code plus court et un peu plus propre.

def parse_products(product_data: (Int, (Prods1, Option[Prods2]))): Product = {
val product_id = product_data._1
val product_name = product_data._2._1.product_name
val aisle_id = product_data._2._1.aisle_id
val department_id = product_data._2._1.department_id
val (orders, reorders) = product_data._2._2 match {
case Some(p2) => (Some(p2.orders), Some(p2.reorders))
case None => (None, None)
}
Product(product_id, product_name, aisle_id, department_id, orders, reorders)
}

0 pour la réponse № 2

Enfin, je l'ai fait comme ceci, le commentaire sur "get" était utile, mais il y avait quelques corrections supplémentaires nécessaires:

def parse_products(product_data: (Int, (Prod1, Option[Prod2]))) = {
val product_id = product_data._1
val product_name = product_data._2._1.product_name
val aisle_id = product_data._2._1.aisle_id
val department_id = product_data._2._1.department_id
var orders: Option[Int] = None
var reorders: Option[Int] = None
if(product_data._2._2.isDefined){
val p2 = product_data._2._2.get
orders = Some(p2.orders)
reorders = Some(p2.reorders)
}
Product(product_id, product_name, aisle_id, department_id, orders, reorders)
}