Spark - 使用java

时间:2017-09-18 15:04:17

标签: java apache-spark word-count

我对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这样可扩展的机器学习算法。

1 个答案:

答案 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.*;