2

Apache Sparkの文字列間でJaro-Winklerの距離計算を実装する必要がありますDataset。私達はスパークするのが新しく、ウェブで検索した後、私たちはあまり見つけることができません。もしあなたが私たちを導くことができれば素晴らしいことでしょう。私たちはflatMapを使用すると考えていましたが、それは助けにならないことに気付きました。その後、foreachループのカップルを使用しようとしましたが、今後の進め方を考え出すことはできませんでした。各文字列はすべてに対して比較されなければならない。下記のデータセットのように。Apache SparkでのJaro-Winklerスコア計算

RowFactory.create(0, "Hi I heard about Spark"), 
RowFactory.create(1,"I wish Java could use case classes"), 
RowFactory.create(2,"Logistic,regression,models,are,neat")); 

例上記のデータフレームで見つかったすべての文字列のjaro winklerスコア。ラベル間

距離スコア、0,1 - > 0.56
距離スコアラベル 間を、0,2 - ラベル間の> 0.77
距離スコア、0,3 - ラベル間の> 0.45
距離スコア、 1,2 - > 0.77
距離スコアラベル 間、2,3 - スパークで> 0.79

import java.util.Arrays; 
    import java.util.Iterator; 
    import java.util.List; 

    import org.apache.spark.SparkConf; 
    import org.apache.spark.api.java.JavaSparkContext; 
    import org.apache.spark.api.java.function.FlatMapFunction; 
    import org.apache.spark.sql.Dataset; 
    import org.apache.spark.sql.Row; 
    import org.apache.spark.sql.RowFactory; 
    import org.apache.spark.sql.SQLContext; 
    import org.apache.spark.sql.SparkSession; 
    import org.apache.spark.sql.types.DataTypes; 
    import org.apache.spark.sql.types.Metadata; 
    import org.apache.spark.sql.types.StructField; 
    import org.apache.spark.sql.types.StructType; 

    import info.debatty.java.stringsimilarity.JaroWinkler; 

    public class JaroTestExample { 
    public static void main(String[] args) 
     { 
     System.setProperty("hadoop.home.dir", "C:\\winutil"); 
     JavaSparkContext sc = new JavaSparkContext(new SparkConf().setAppName("SparkJdbcDs").setMaster("local[*]")); 
     SQLContext sqlContext = new SQLContext(sc); 
     SparkSession spark = SparkSession.builder() 
     .appName("JavaTokenizerExample").getOrCreate(); 
     JaroWinkler jw = new JaroWinkler(); 

      // substitution of s and t 
      System.out.println(jw.similarity("My string", "My tsring")); 

      // substitution of s and n 
      System.out.println(jw.similarity("My string", "My ntrisg")); 

      List<Row> data = Arrays.asList(
     RowFactory.create(0, "Hi I heard about Spark"), 
     RowFactory.create(1,"I wish Java could use case classes"), 
     RowFactory.create(2,"Logistic,regression,models,are,neat")); 

      StructType schema = new StructType(new StructField[] { 
     new StructField("label", DataTypes.IntegerType, false, 
     Metadata.empty()), 
     new StructField("sentence", DataTypes.StringType, false, 
     Metadata.empty()) }); 

      Dataset<Row> sentenceDataFrame = spark.createDataFrame(data, schema); 

      sentenceDataFrame.foreach(); 

     } 

    } 

答えて

2

クロスジョインは、以下のコードを用いて行うことができますDataset2Object = Dataset1Object.crossJoin(Dataset2Object) Dataset2Objectでは、必要なrecordpairのすべての組み合わせを取得します。この場合、フラットマップは役に立ちません。 バージョン2.1.0のspark-sql_2.11を使用してください。

関連する問題