2017-09-18 24 views
0

私はSparkには新しく、Datasetクラスを使ってテキストファイルから機能(基本的には単語数)を抽出したいと思います。私は"Extracting, transforming and selecting features"のスパークに関するチュートリアルを読んだが、報告されたすべての例は「オンザフライ」で定義された単語の袋から始まる。私は、テキストファイルから始めて、同じ種類のデータセットを生成するために何回も試みましたが、私は常に失敗しました。ここに私のコードは次のとおりです。Javaを使ったスパークワード数

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) 

を私は把握することはできませんどうやってするか。

基本的に、長い文字列から生成された文字列の単語数に基づいて分類システムを訓練しようとしていました。テキストファイルには1行に1つのシーケンスが含まれているので、各行ごとに分割してカウントする必要があります(サブ文字列は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.*;を追加することを忘れないでください。