2015-09-15 2 views
1

В основном я хочу что-то вроде этого,Как сгенерировать случайный РДД в Java Спарк

int count = 100; 
Java<String> myRandomRDD = generate(count, new Function<String, String>() { 
     @Override 
     public String call(String arg0) throws Exception { 
      return RandomStringUtils.randomAlphabetic(42); 
     } 
    }); 

Теоретически я мог бы использовать Спарк RandomRDD, но я не могу заставить его работать правильно. Я ошеломлен выборами. Должен ли я использовать RandomRDDs::randomRDD или RandomRDDs::randomRDDVector? Или я должен использовать RandomVectorRDD?

Я пробовал следующее, но я даже не могу заставить синтаксис быть правильным.

RandomRDDs.randomRDD(jsc, new RandomDataGenerator<String>() { 

     @Override 
     public void setSeed(long arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public org.apache.spark.mllib.random.RandomDataGenerator<String> copy() { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public String nextValue() { 
      RandomStringUtils.randomAlphabetic(42); 
     } 
    }, count, ??); 

Документация разрежена, я смущен, и я был бы признателен за любую помощь.

Спасибо!

+1

Помните, если я спрошу, для чего это необходимо? Так как если его для тестирования подхода на основе scalacheck может быть лучше (но в противном случае мы можем вникнуть в RandomRDD). – Holden

+0

Я генерирую переменную широковещания и пытаюсь настроить память драйвера и spark.driver.maxResultSize.Поэтому лучший подход, который я вижу, - создать репрезентативный RDD, затем вызвать сборку, и посмотреть, получаю ли я кучу ошибок Java или OutOfMemoryError. В противном случае мне нужно ждать 8 часов, чтобы переменная широковещания была заполнена с 1 месяца данных. – 0111001101110000

+0

Ах, тогда, похоже, что использование RandomRDD было бы хорошим вариантом. – Holden

ответ

2

Самое простое решение, которое я могу думать:

JavaRDD<String> randomStringRDD = RandomRDDs.uniformJavaRDD(jsc, numRows).map((Double d) -> RandomStringUtils.randomAlphabetic(42)); 

Вот более полный пример для проверки на месте:

SparkConf conf = new SparkConf().setAppName("Test random").setMaster("local"); 
    JavaSparkContext jsc = new JavaSparkContext(conf); 

    int numRows= 10;//put here how many rows you want 
    JavaRDD<String> randomStringRDD = RandomRDDs.uniformJavaRDD(jsc, rows).map((Double d) -> RandomStringUtils.randomAlphabetic(42)); 

    //display (to use only on small dataset) 
    for(String row:randomStringRDD.collect()){ 
     System.out.println(numRows); 
    } 

Существует небольшие накладные расходы CPU, так как нет необходимости генерировать исходный набор случайных чисел, но он заботится о создании разделов и т. д.

Если вы избегаете, чтобы небольшие накладные расходы были важны для вас, и вы хотите сгенерировать 1 миллион строк в 10 разделов, вы можете попробовать следующее:

  1. Создание пустой RDD с помощью jsc.emptyRDD()
  2. Установите его разделение с помощью передела создать 10 разделов
  3. использовать функцию mapPartition для создания 1milion/10 partition = 100000 строк на раздел. Ваш RDD готов.

Боковые ноты:

  • Имея класс RandomRDDs.randomRDD() подвергается бы проще, но, к сожалению, нет.
  • Однако RandomRDDs.randomVectorRDD() открыт, поэтому вы можете использовать его, если вам нужно создать рандомизированные векторы. (но вы запросили здесь строки, чтобы они не применялись).
+1

Эти шаги от вашего ответа сработали для меня. 1. Создайте пустой rdd через jsc.emptyRDD(), 2. Установите его разбиение по разделам на 10 разделов, 3. используйте функцию mapPartition для создания раздела 1milion/10 = 100000 строк на раздел. Ваш RDD готов. – 0111001101110000

+0

+1, @Julien. У меня также есть аналогичное требование и использование этого подхода, но проблема в том, что строки для каждого раздела огромны, поэтому они вызывают «OutOfMemory». Потому что я не могу увеличить количество разделов, за пределами определенного числа. – Ajeet

1

Класс RandomRDD является закрытым для Spark, но мы можем получить доступ к классу RandomRDDs и создать их. Есть несколько примеров в JavaRandomRDDsSuite.java (см. https://github.com/apache/spark/blob/master/mllib/src/test/java/org/apache/spark/mllib/random/JavaRandomRDDsSuite.java). Кажется, что примеры ява все делают двойника и тому подобное, но мы можем использовать это и превратить его в строки следующим образом:

import static org.apache.spark.mllib.random.RandomRDDs.*; 
... 
JavaDoubleRDD rdd1 = normalJavaRDD(sc, size, numPartitions); 
JavaRDD<String> rdd = rdd1.map(e -> Double.toString(e)); 

В таком СИАД мы могли бы использовать функцию randomRDD, но он использует класс тегов, которые являются бит расстраивает для использования с Java. (Я создал JIRA https://issues.apache.org/jira/browse/SPARK-10626, чтобы сделать простой Java API для доступа к этому).

Смежные вопросы