如何在Java Spark中生成随机RDD

时间:2015-09-15 20:06:26

标签: java random apache-spark

基本上我想要这样的东西,

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

理论上我可以使用Spark 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, ??);

文档很少,我很困惑,我很感激任何帮助。

谢谢!

2 个答案:

答案 0 :(得分: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开销很小,因为不需要生成初始的随机数集,但它会负责创建分区等。

如果避免这么小的开销对您很重要,并且您希望在10个分区中生成100万行,则可以尝试以下操作:

  1. 通过jsc.emptyRDD()
  2. 创建一个空的rdd
  3. 通过重新分区设置其分区以创建10个分区
  4. 使用mapPartition函数创建1milion / 10分区=每个分区100000行。你的RDD准备好了。
  5. 附注:

    • 暴露出RandomRDDs.randomRDD()类会让它变得更简单,但遗憾的是没有。
    • 但是,RandomRDDs.randomVectorRDD()是公开的,因此如果需要生成随机向量,可以使用它。 (但你在这里要求使用Strings,因此不适用)。

答案 1 :(得分:1)

RandomRDD类是Spark专用的,但我们可以访问RandomRDDs类并创建它们。 JavaRandomRDDsSuite.java中有一些示例(请参阅https://github.com/apache/spark/blob/master/mllib/src/test/java/org/apache/spark/mllib/random/JavaRandomRDDsSuite.java)。似乎java的例子都是Double和类似的,但我们可以使用它并把它变成字符串,如下所示:

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来访问它。)