1

스파크의 Dataset의 거대한 컬렉션에서 jaccard와 같은 거리 매트릭스를 계산해야합니다. 직면 한 몇 가지 문제. 친절하게 우리에게 방향을 알려주세요.거대한 작업을 위해 Apache Spark에서 맵 함수 사용

문제 1

import info.debatty.java.stringsimilarity.Jaccard; 

    //sample Data set creation 
    List<Row> data = Arrays.asList(
       RowFactory.create("Hi I heard about Spark", "Hi I Know about Spark"), 
       RowFactory.create("I wish Java could use case classes","I wish C# could use case classes"), 
       RowFactory.create("Logistic,regression,models,are,neat","Logistic,regression,models,are,neat")); 

    StructType schema = new StructType(new StructField[] {new StructField("label", DataTypes.StringType, false,Metadata.empty()), 
       new StructField("sentence", DataTypes.StringType, false,Metadata.empty()) }); 
       Dataset<Row> sentenceDataFrame = spark.createDataFrame(data, schema); 

       // Distance matrix object creation 
       Jaccard jaccard=new Jaccard(); 

       //Working on each of the member element of dataset and applying distance matrix. 
       Dataset<String> sentenceDataFrame1 =sentenceDataFrame.map(
         (MapFunction<Row, String>) row -> "Name: " + jaccard.similarity(row.getString(0),row.getString(1)),Encoders.STRING() 
       ); 
       sentenceDataFrame1.show(); 

없음 컴파일시 오류가 없습니다. 그러나 점점 런타임 예외 같은 :

org.apache.spark.SparkException : 작업 직렬화하지

문제 2
는 또한 우리가하는 우리가 일부를 선언 할 필요가 가장 높은 점수를 가지고하는 쌍을 찾을 필요 변수. 또한 우리는 다른 계산을 수행 할 필요가 있습니다. 우리는 많은 어려움에 직면 해 있습니다.
MapBlock에서 카운터와 같은 간단한 변수를 선언하려고해도 증가 값을 캡처 할 수 없습니다. Map 블록 밖에서 선언하면 컴파일 시간 오류가 많이 발생합니다.

int counter=0; 
     Dataset<String> sentenceDataFrame1 =sentenceDataFrame.map(
       (MapFunction<Row, String>) row -> { 
        System.out.println("Name: " + row.getString(1)); 
        //int counter = 0; 
        counter++; 
        System.out.println("Counter: " + counter); 
        return counter+""; 

       },Encoders.STRING() 

     ); 

알려주십시오. 감사합니다.

답변

1

Jaccard jaccard = new Jaccard();

is이 클래스는 직렬화 가능합니까?

스파크에서 변환 내에서 작성하는 모든 코드는 직렬화 된 드라이버에서 인스턴스화되어 실행 프로그램으로 전송됩니다. 당신이 사용 람다 기능을 가지고

는 : 람다 내부에서 외부 클래스에서 사용

  1. 모든 클래스는 직렬화 할 필요가있다.

  2. 외부 클래스의 메서드를 심지어 람다 내부에서 사용하는 경우에는 외부 클래스를 직렬화 할 수 있어야합니다.

    http://bytepadding.com/big-data/spark/spark-code-analysis/

    http://bytepadding.com/big-data/spark/understanding-spark-serialization/

    제 2 부 :

은 참조하시기 바랍니다 상세 이해하게하려면 스파크에 직교 제품 N CROSS N을 찾을

  1. 시도합니다.
  2. 더 똑똑한 알고리즘을 찾아 쌍을 찾으십시오.

더 많은 답변을 제공하는 데 도움이되는 질문이 더 많습니다.

관련 문제