如何解决如何有效地将数据框对象解析为键值对映射
我正在使用具有列numpy
和basketID
的数据框。有没有一种方法可以有效地解析数据集并生成一个映射,其中的键是itemID
,并且值是每个购物篮中包含的所有basketID
的集合?
我当前的实现在数据帧上使用了for循环,但伸缩性不是很好。有可能更有效地做到这一点吗?任何帮助将不胜感激,谢谢!
目标是获得itemID
。这是我使用for循环的实现
basket = Map("b1" -> Set("i1","i2","i3"),"b2" -> Set("i2","i4"),"b3" -> Set("i3","i5"),"b4" -> Set("i6"))
解决方法
您只需执行aggregateByKey操作,然后collectItAsMap将直接为您提供所需的结果。它比简单的groupBy效率更高。
import scala.collection.mutable
case class Items(basketID: String,itemID: String)
import spark.implicits._
val result = output.as[Items].rdd.map(x => (x.basketID,x.itemID))
.aggregateByKey[mutable.Buffer[String]](new mutable.ArrayBuffer[String]())
((l: mutable.Buffer[String],p: String) => l += p,(l1: mutable.Buffer[String],l2: mutable.Buffer[String]) => (l1 ++ l2).distinct)
.collectAsMap();
您可以在here上检查其他聚合api,如reduceBy和groupBy。 也请检查aggregateByKey vs groupByKey vs ReduceByKey的差异。
,如果您的数据集足够小以适合驱动程序的内存,这将非常有效。 .collect
将为您提供要迭代的行数组,这很好。如果您想要可伸缩性,则可以使用Map[String,Set[String]]
(将分布在驱动器内存中)而不是PairRDD[String,Set[String]]
(将存储在驱动程序内存中)。
//NOT TESTED
//Assuming df is dataframe with 2 columns,first is your basketId and second is itemId
df.rdd.map(row => (row.getAs[String](0),row.getAs[String](1)).groupByKey().mapValues(x => x.toSet)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。