我对Spark很陌生,我想使用Dataset
类从文本文件中提取功能(基本上是字数)。我已经阅读了Spark上的"Extracting, transforming and selecting features"教程,但是每个报告的例子都是从一包“动态”定义的单词开始的。我已尝试多次从文本文件开始生成相同类型的数据集,但我一直都失败了。这是我的代码:
SparkSession spark = SparkSession
.builder()
.appName("Simple application")
.config("spark.master", "local")
.getOrCreate();
Dataset<String> textFile = spark.read()
.textFile("myFile.txt")
.as(Encoders.STRING());
Dataset<Row> words = textFile.flatMap(s -> {
return Arrays.asList(s.toLowerCase().split("AG")).iterator();
}, Encoders.STRING()).filter(s -> !s.isEmpty()).toDF();
Word2Vec word2Vec = new Word2Vec()
.setInputCol("value")
.setOutputCol("result")
.setVectorSize(16)
.setMinCount(0);
Word2VecModel model = word2Vec.fit(words);
Dataset<Row> result = model.transform(words);
我收到以下错误消息:Exception in thread "main" java.lang.IllegalArgumentException: requirement failed: Column value must be of type equal to one of the following types: [ArrayType(StringType,true), ArrayType(StringType,false)] but was actually of type StringType.
我想我必须使用以下内容将每一行转换为一行:
RowFactory.create(0.0, line)
但我无法弄清楚如何做到这一点。
基本上,我试图根据从长字符序列生成的字符串的字数来训练分类系统。我的文本文件每行包含一个序列,因此我需要为每一行拆分和计算它们(子字符串称为k-mers,可以找到一般描述here)。根据k-mers的长度,我可以有超过4 ^ 32个不同的字符串,所以我一直在寻找像Spark这样可扩展的机器学习算法。
答案 0 :(得分:0)
如果您只想计算出现的单词,可以这样做:
Dataset<String> words = textFile.flatMap(s -> {
return Arrays.asList(s.toLowerCase().split("AG")).iterator();
}, Encoders.STRING()).filter(s -> !s.isEmpty());
Dataset<Row> counts = words.toDF("word").groupBy(col("word")).count();
Word2Vec是更强大的ML算法,在您的情况下,没有必要使用它。请记住在文件的开头添加import static org.apache.spark.sql.functions.*;