2017-02-18 14 views
0

Я пытаюсь перенести код hadoop в искру. У меня уже есть некоторые предопределенные функции, которые я должен иметь возможность использовать в искры, поскольку они представляют собой просто коды Java, без значительной зависимости от hadoop. У меня есть функция, которая принимает входные данные (пространственные данные, долготу, широту) в текстовом формате и преобразует их в форму (полигоны, линейный поток и т. Д.). Когда я пытаюсь прочитать его в Spark, я сначала читаю каждую строку файлов как String. Затем преобразуйте их в Text, чтобы я мог использовать ранее созданную функцию. Но у меня есть два сомнения, во-первых, похоже, что JavaRDD не использует Text, и у меня возникают некоторые проблемы для этого. Во-вторых, функция, которая преобразует текст в фигуру, ничего не возвращает. Но я не могу использовать flatMap или любую другую технологию отображения. Я даже не уверен, правильный ли мой подход или нет.Использование текстового типа данных в JavaRDD и возврат пустоты в FlatMap

Вот мой код модели:

/*function for converting Text to Shape*/ 
public interface TextSerializable { 
public Text toText(Text text); 
public void fromText(Text text); 
* Retrieve information from the given text. 
* @param text The text to parse 
*/ 
} 



/*Shape Class looks something like this*/ 

public interface Shape extends Writable, Cloneable, TextSerializable { 
/
* Returns minimum bounding rectangle for this shape. 
* @return The minimum bounding rectangle for this shape 
*/ 
public Rectangle getMBR(); 

/** 
* Gets the distance of this shape to the given point. 
* @param x The x-coordinate of the point to compute the distance to 
* @param y The y-coordinate of the point to compute the distance to 
* @return The Euclidean distance between this object and the given point 
*/ 
...... 
...... 
......*/ 

/*My code structure*/ 

SparkConf conf = new SparkConf().setAppName("XYZ").setMaster("local"); 
JavaSparkContext sc =new JavaSparkContext(conf); 

final Text text=new Text(); 

JavaRDD<String> lines = sc.textFile("ABC.csv"); 

lines.foreach(new VoidFunction<String>(){ 
public void call(String lines){ 
     text.set(lines); 
     System.out.println(text); 
    } 
    }); 

/*Problem*/ 
text.flatMap(new FlatMapFunction<Text>(){ 
    public Iterable<Shape> call(Shape s){ 
     s.fromText(text); 
     //return void; 
    } 

Последняя строка кода не так, но я не знаю, как это исправить. JavaRDD может использоваться с определенным пользователем классом (согласно моим знаниям). Я даже не уверен, способ, которым я преобразовал строки в текстовый текст, если это разрешено в RDD или нет. Я совершенно новый в Spark. Любая помощь будет отличной.

ответ

0

Вы полностью исключены из концепции. Во-первых, вы не можете вызывать такие функции, как map, flatmap и т. Д. На любом объекте, который они могут вызывать только из JavaRDD, а Text не является JavaRDD, а Spark поддерживает текст, но не так, как вы его использовали.

Сейчас подходит к вашему вопросу, так как вы хотите, чтобы преобразовать строку в текст использовать формат что-то вроде этого

SparkConf conf = new SparkConf().setAppName("Name of Application"); 
    JavaSparkContext sc = new JavaSparkContext(conf); 
    JavaRDD<String> logData = sc.textFile("replace with address of file"); 

/*This map function will take string as input because we are calling it on javaRDD logData and that logData return string type value. This map fucntion will give Text as output 
you can replace the return statement with logic of your toText function(However new Text(s) is also a way to convert string into Text) but remember use of return is mandatory so apply logic accordingly 
     */ 
     JavaRDD<Text> rddone = logData.map(new Function<String,Text>(){ 
      public Text call(String s) 
      {// type logic of your toText() function here 
      return new Text(s);}}); 

Теперь, когда мы называем нашу функцию flatmap над JavaRDD rddone он будет принимать входные данные как текст, так как на выходе rddone является Text, и он может выдавать вывод независимо от того, что вы хотите.

/* This flatmap fucntion will take Text as input and will give iterator over object */ 
    JavaRDD <Object> empty = rddone.flatMap(new FlatMapFunction<Text,Object>(){ 
      public Iterator<Object> call(Text te) 
      { 
       // here you can call your fromText(te) method. 
       return null; 
     } 
     }); 

также передать эти ссылки для получения более подробной информации http://spark.apache.org/docs/latest/programming-guide.html

http://spark.apache.org/docs/latest/api/java/index.html?org/apache/spark/api/java/JavaRDD.html

+0

Спасибо много. Я понял, как это сделать. – SGh