Apache Spark中的Jaro-Winkler得分计算

时间:2017-01-17 16:02:09

标签: apache-spark apache-spark-mllib apache-spark-ml apache-spark-2.0 apache-spark-dataset

我们需要在Apache Spark Dataset 中跨字符串实现Jaro-Winkler距离计算。我们是新兴的火花,在网上搜索后我们找不到多少。如果你可以指导我们会很棒。我们想过使用 flatMap 然后意识到它无济于事,然后我们尝试使用几个foreach循环但却无法确定如何继续前进。因为每个字符串都必须与所有字符串进行比较。如下面的数据集。

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 个答案:

答案 0 :(得分:1)

使用以下代码可以完成spark中的交叉连接 Dataset2Object = Dataset1Object.crossJoin(Dataset2Object) 在Dataset2Object中,您可以获得所需的记录对的所有组合。在这种情况下,flatmap不会有用。 请记住使用版本spark-sql_2.11版本2.1.0

答案 1 :(得分:1)

斯卡拉

您可以按如下方式使用spark-stringmetric库:

import com.github.mrpowers.spark.stringmetric.SimilarityFunctions

df.withColumn(
  "w1_w2_jaro_winkler",
  SimilarityFunctions.jaro_winkler(col("word1"), col("word2"))
)

PySpark

您可以按如下方式使用ceja库:

import ceja

df.withColumn("jaro_winkler_similarity", ceja.jaro_winkler_similarity(col("word1"), col("word2")))