运行此方法时出现问题:
value union is not a member of scala.concurrent.Future[(scala.concurrent.Future[org.apache.spark.sql.DataFrame], scala.concurrent.Future[org.apache.spark.sql.DataFrame], scala.concurrent.Future[org.apache.spark.sql.DataFrame])]..
当我添加变量时,我得到了这个。
我不明白的是$ item-> nutritionalValue ['calories']正确地是dd,但是控制台告诉我找不到卡路里的索引。同样奇怪的是,该行没有抛出异常:
val future_session = Future{ ProcessSession(df, spark) }
val future_links = Future{ ProcessSession(df, spark) }
val future_nodes = Future { ProcessSession(df, spark) }
val result = for {
r1 <- future_session
r2 <- future_links
r3 <- future_nodes
} yield (
r1,r2,r3
)
result.onComplete {
case Success(x) => {
log.info("Execution completed")
}
case Failure(e) => e.printStackTrace
}
我使用雄辩的关系获取营养价值,这是与成分之间的关系。
感谢您的帮助!
编辑:我正在循环内调用函数:
public function getNutritionalValuesPerMeal($item,$nutritionalValues){
foreach (array($nutritionalValues) as $key => $value) {
if (array_key_exists($key, $item->nutritionalValue->attributes)) {
$nutritionalValues[$key] += $item->nutritionalValue->attributes[$key];
}
}
return $nutritionalValues;
}
我不知道这怎么可能,因为发送到此方法的每个数组都是相同的...
编辑2:问题已解决!
答案 0 :(得分:2)
在不知道方法的范围和上下文的情况下,访问属性的最安全方法是$item->nutritionalValue->attributes['calories']
等。更多信息:https://laravel.com/docs/6.x/eloquent-mutators#attribute-casting
为什么dd()
可以访问该属性-这是因为dd()
在对象上运行某种get()
方法。
除此之外,我将重构您的方法,如下所示:
public function getNutritionalValuesPerMeal($item, $nutritionalValues)
{
foreach ($nutritionalValues as $key => $value) {
if (array_key_exists($key, $item->nutritionalValue->attributes)) {
$nutritionalValues[$key] += $item->nutritionalValue->attributes[$key];
}
}
return $nutritionalValues;
}