当前位置: 首页 > 知识库问答 >
问题:

如何将稀疏向量的Spark DataFrame列转换为密集向量的列?

高弘光
2023-03-14
df.withColumn("dense_vector", $"sparse_vector".toDense)  

但它给出了一个错误。

我对Spark是新手,所以这可能很明显,在我的代码行中可能有明显的错误。请帮忙。谢谢!

共有1个答案

班浩皛
2023-03-14

需要这样操作的上下文在Spark中相对较少。对于一个或两个异常,Spark API需要公共vector类而不是特定的实现(sparsevectordensevector)。对于来自o.a.s.mllib.linalg.distributed的分布式结构也是如此

import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.mllib.linalg.distributed.RowMatrix

val df = Seq[(Long, Vector)](
  (1L, Vectors.dense(1, 2, 3)), (2L, Vectors.sparse(3, Array(1), Array(3)))
).toDF("id", "v")

new RowMatrix(df.select("v")
  .map(_.getAs[Vector]("v")))
  .columnSimilarities(0.9)
  .entries
  .first
// apache.spark.mllib.linalg.distributed.MatrixEntry = MatrixEntry(0,2,1.0)

不过,您可以使用如下所示的UDF:

val asDense = udf((v: Vector) => v.toDense)

df.withColumn("vd", asDense($"v")).show
// +---+-------------+-------------+
// | id|            v|           vd|
// +---+-------------+-------------+
// |  1|[1.0,2.0,3.0]|[1.0,2.0,3.0]|
// |  2|(3,[1],[3.0])|[0.0,3.0,0.0]|
// +---+-------------+-------------+

请记住,由于2.0版Spark提供了两种不同且兼容的vector类型:

    null
 类似资料:
  • 问题内容: 最近,Elasticsearch允许在查询中使用向量和稀疏向量。在他们的文档之后,我发现了一个错误,本质上是: 似乎“嵌入”不是一个成功的领域。 我将文档上传到Elasticsearch如下: 我为每个文档创建一个json文件 我在Python中加载json文件 我将这些objetcs传递给Elasticsearch: 这是我的json文件的结构(请注意,嵌入是字典,因为它是稀疏向量)

  • 问题内容: 假设我有一个形状为(1,256)的行向量。我想将其转换为形状为(256,1)的列向量。您在Numpy中会如何做? 问题答案: 您可以使用 转置 操作来执行此操作: 例: 请注意,原始数组仍将保持不变。转置操作只会复制并转置它。 如果输入阵列是相当1D中,则可以 促进 通过引入新的(singleton)的轴作为所述第二尺寸数组的列向量。下面是一个示例: 对于一维情况,还有另一个选择是使用

  • 我是Spark和Scala的新手,我正在尝试阅读它在MLlib上的文档。 关于 http://spark.apache.org/docs/1.4.0/mllib-data-types.html 的教程, 不显示如何从本地向量列表构造RDD[Vector](可变行)。 例如,我已经在火花壳中执行(作为我探索的一部分) 如果“合并”,它将看起来像这个矩阵 那么,如何将矢量 、 转换为?

  • 注意温度场是一个浮动列表。我希望将这些浮点数列表转换为MLlib类型,并且希望这种转换使用基本的API来表示,而不是通过RDDs(这是低效的,因为它将所有数据从JVM发送到Python,处理是在Python中完成的,我们没有得到Spark的Catalyst优化器yada yada的好处)。我该怎么做?具体来说: 有没有办法让直铸件工作?请参见下面的详细信息(以及一次失败的变通尝试)?或者,是否有其

  • 我有一个整数向量: 考虑到将始终为偶数。 我只是想把相邻的元素转换成一对,像这样: i、 两个相邻的元件连接成一对。 我可以使用什么STL算法轻松实现这一点?有没有可能通过一些标准算法来实现这一点? 当然,我可以很容易地编写一个旧的索引for循环来实现这一点。但我想知道,使用基于范围的for循环或任何其他STL算法(如等)最简单的解决方案是什么样的。

  • 我的原始模式包含许多我想在ML模型中使用的映射类型,因此我需要将它们转换为SparkML稀疏向量。 背景:SparkML模型要求将数据形成特征向量。有一些实用程序可以生成特征向量,但都不支持maptype类型。e、 g.SparkML VectorAssembler允许组合多个列(所有数字类型、布尔类型或向量类型)。 编辑: 到目前为止,我的解决方案是将映射分解为单独的列,然后使用向量汇编程序: