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

在Spark2.0中访问向量列时的MatchError

薄瑞
2023-03-14
import org.apache.spark.sql.SparkSession

val sparkSession = SparkSession.builder
  .master("local")
  .appName("my-spark-app")
  .config("spark.some.config.option", "config-value")
  .getOrCreate()

 val df = spark.read.json("dbfs:/mnt/JSON6/JSON/sampleDoc.txt")
display(df)
import org.apache.spark.ml.feature.RegexTokenizer

// Set params for RegexTokenizer
val tokenizer = new RegexTokenizer()
                .setPattern("[\\W_]+")
                .setMinTokenLength(4) // Filter away tokens with length < 4
                .setInputCol("text")
                .setOutputCol("tokens")

// Tokenize document
val tokenized_df = tokenizer.transform(df)
display(tokenized_df)
%sh wget http://ir.dcs.gla.ac.uk/resources/linguistic_utils/stop_words > -O /tmp/stopwords

可选:将停止文字复制到tmp文件夹

%fs cp file:/tmp/stopwords dbfs:/tmp/stopwords

收集所有停止字

val stopwords = sc.textFile("/tmp/stopwords").collect()

筛选出停止字

 import org.apache.spark.ml.feature.StopWordsRemover

 // Set params for StopWordsRemover
 val remover = new StopWordsRemover()
                   .setStopWords(stopwords) // This parameter is optional
                   .setInputCol("tokens")
                   .setOutputCol("filtered")

 // Create new DF with Stopwords removed
 val filtered_df = remover.transform(tokenized_df)
 display(filtered_df)
 import org.apache.spark.mllib.linalg.Vectors
 import org.apache.spark.sql.Row
 import org.apache.spark.ml.feature.CountVectorizer

 // Set params for CountVectorizer
 val vectorizer = new CountVectorizer()
               .setInputCol("filtered")
               .setOutputCol("features")
               .fit(filtered_df)
 vectorizer.transform(filtered_df)
           .select("id", "text","features","filtered").show()
import org.apache.spark.mllib.linalg.Vector
val ldaDF = countVectors.map { 
             case Row(id: String, countVector: Vector) => (id, countVector) 
            }
display(ldaDF)
org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 4083.0 failed 4 times, most recent failure: Lost task 0.3 in stage 4083.0 (TID 15331, 10.209.240.17): scala.MatchError: [0,(1252,[13,17,18,20,30,37,45,50,51,53,63,64,96,101,108,125,174,189,214,221,224,227,238,268,291,309,328,357,362,437,441,455,492,493,511,528,561,613,619,674,764,823,839,980,1098,1143],[1.0,1.0,2.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,3.0,1.0,2.0,1.0,5.0,1.0,2.0,2.0,1.0,4.0,1.0,2.0,3.0,1.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,1.0,2.0,1.0,2.0,1.0,1.0,1.0])] (of class org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema)
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.sql.Row
import org.apache.spark.mllib.linalg.Vector
import org.apache.spark.mllib.clustering.{DistributedLDAModel, LDA}

val a = Vectors.dense(Array(1.0,2.0,3.0))
val b = Vectors.dense(Array(3.0,4.0,5.0))
val df = Seq((1L,a),(2L,b),(2L,a)).toDF

val ldaDF = df.map { case Row(id: Long, countVector: Vector) => (id, countVector) } 

val model = new LDA().setK(3).run(ldaDF.javaRDD)
display(df)

唯一的区别是在第二个片段中,我们有一个密集的矩阵。

共有1个答案

盖高畅
2023-03-14

这与稀疏性无关。由于Spark 2.0.0MLTransformers不再生成O.a.s.mllib.linalg.vectorudt,而是生成O.a.s.ML.linalg.vectorudt,并且在本地映射到O.a.s.ML.linalg.vector的子类。这些与旧的MLLib API不兼容,旧的MLLib API在Spark2.0.0中正走向废弃。

您可以使用vectors.fromml,将between转换为“old”:

import org.apache.spark.mllib.linalg.{Vectors => OldVectors}
import org.apache.spark.ml.linalg.{Vectors => NewVectors}

OldVectors.fromML(NewVectors.dense(1.0, 2.0, 3.0))
OldVectors.fromML(NewVectors.sparse(5, Seq(0 -> 1.0, 2 -> 2.0, 4 -> 3.0)))

但是,如果您已经使用了ML转换器,那么使用LDA的ML实现更有意义。

import scala.languageFeature.implicitConversions

object VectorConversions {
  import org.apache.spark.mllib.{linalg => mllib}
  import org.apache.spark.ml.{linalg => ml}

  implicit def toNewVector(v: mllib.Vector) = v.asML
  implicit def toOldVector(v: ml.Vector) = mllib.Vectors.fromML(v)
}
 类似资料:
  • 我有一个定义如下的类。h: 输出流函数有问题。在cpp文件中,我将其定义为: 下面是std'const错误:, 错误:传递“const std::map,std::vector” 当我从ostream操作符重载的定义中删除const保护时,这个编译很好,但是,我相信我应该能够使用const保护来完成它,根据我的老师的说法,现在养成这个习惯是更好的做法。有谁能给我指点一下为什么这本书不能编译? 不过

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

  • 问题内容: 我在python中有一个由列表列表建模的2D数组,我想提取该列。我进行了快速研究,发现了一种使用numpy数组的方法。问题是 我不想使用numpy, 所以不想将列表列表转换为numpy数组,然后使用[:,1]语法。我尝试在正常的列表列表上使用它,但显示错误,因此是不可能的。我正在为列表列表请求类似的东西,而不必遍历每个元素(在numpy数组中,使用[:,1]语法访问列比在数组元素上进行

  • 所以,我有一个类a,它有一个(公共静态WebElement1,element2)。 然后我有一个测试类,它有一个叫做@test public void testclassa的方法。 问题是我正在获取org.openqa.selenium.NosuChelementException:无法定位元素:{}错误。我认为我的错误正在发生,因为element2位于下一页,它在单击按钮后显示。我应该在代码中做

  • 问题内容: 我在SASS中有一个列表,并且我正在尝试使用方括号表示法访问这些项目: 但这给了我一个错误。 还有其他方法吗? 我为什么要这样做? 我有一个颜色列表,必须根据服务器分配给它们的颜色在不同的元素上进行设置。标记已编号的类(,等)。这是我的目标CSS: 我想不用手工编写所有内容,而是可以将SASS集合与循环一起使用: 但这只是给我以下错误: 语法错误:“ … color-collectio

  • 问题内容: 在理解查询别名在Postgresql中的工作方式时有些麻烦。我有以下几点: 我可以使用as命令重命名“ count1”列,但似乎无法在查询中再次引用它吗?我试图在此查询的末尾包含一个HAVING命令,以仅查询计数少于最大值的一半的对象。 这是家庭作业,但我不是在寻求答案,而是一个指向如何在另一个子句中包含count1列的指针。 有人可以帮忙吗? 问题答案: 通常,您不能在查询的后面引用