【问题标题】:Vector vs Vectors in spark [duplicate]Spark中的向量与向量[重复]
【发布时间】:2018-06-16 02:34:02
【问题描述】:

我是 Spark 的新手。 我正在尝试读取包含以下数据的文本文件:

时间戳 id 计数器值


00:01     1  c1     0.5
00:02     5  c3     0.3
00:03     1  c2     0.1
00:04     2  c2     0.13

并将它们转换为:

(id,array_of_counters):


(1, [ c1   c2 ])  
    [ 0.5  0.1] 

因此,对于每个id,我创建一个2d array,它将在文本文件中包含该特定id 的每个计数器和每个值。

我尝试使用Vectors 来做,但我认为存储在其中的内容必须是双倍的,并且我不能添加两个向量,除非它们是微风向量。

然后,我发现有一个名为 Vector 的数据结构,但我找不到有关它的任何详细信息。

那么,我的问题是mllib 中的VectorVectors 之间的主要区别是什么?

代码:

val inputRdd = sc.textFile(inputFile).map(x => x.split(","))
val data = inputRdd.map(y => (y(1), Vector(y(2), y(3)))).reduceByKey(_++_)

【问题讨论】:

  • 我相信 OP 询问的是 spark 的 Vector 类型,而不是 scala 的内置集合。

标签: scala apache-spark vector


【解决方案1】:

我不认为Vector 对您在这里尝试做的事情是必要的或适当的(我可能错了,我们需要更多关于您想要完成的事情的细节)。唯一有意义的方法是每个 id 是否有固定数量的 countersc1c2 等...)。如果您只是想要一组每个 id 及其对应的 counters 和值列表,试试这个(我假设计数器对于每个 id 都是唯一的):

val data = inputRdd
  .map(y => (y(1).toLong, y(2), y(3).toDouble))
  .toDF("id", "counter", "value")
  .groupBy("id")
  .agg(collect_list(map($"counter", $"value")))
  .as[(Long, Seq[Map[String, Double]])]
  .map(r => (r._1, r._2.reduce(_++_)))
  //this results in a Dataset[(Long, Map[String, Double])]

火花ml.linalg.Vector 基本上是Array[Double],并且每条记录都需要固定数量的counter。您可以通过将Map[String, Double]._1 排序并从Vector.values 创建一个Vector,将上面的data 转换为一个向量。

ml.linalg.Vectors 只是一个辅助对象,具有创建Vector 对象的功能。

org.apache.spark.ml.linalg.Vector 的工厂方法。我们不使用 Vector 这个名称,因为 Scala 默认导入 scala.collection.immutable.Vector。

还值得注意的是,mllib 适用于较旧的 RDD API,而ml 适用于较新的 Dataframe/Dataset API。

编辑:RDD[(Long, Seq[(String, Double)])]

val data = inputRdd
  .map(y => (y(1).toLong, Seq[(String, Double)]((y(2), y(3).toDouble))))
  .reduceByKey(_++_)

【讨论】:

  • 我想要的是为每个 id 提供一个包含计数器和值的数组。不,每个 id 没有固定数量的计数器,但我正在尝试从论文中创建一个算法,并且在论文中每个 id 都有一个数组。在我的情况下,是否还有其他不使用 Dataframe/Dataset API 的数据结构?
  • 它是否必须是问题中提出的2d array?对我来说,RDD[(Long, Map[String, Double])] 似乎是最有意义的……
  • 问题是,对于每个计数器,每个 id 中都会有多个值,所以我认为 map 不适用于这种情况。
  • 明白了,那么Seq[(String, Double)]呢?
猜你喜欢
  • 2011-11-29
  • 2014-03-13
  • 1970-01-01
  • 2013-07-31
  • 2017-11-09
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多