基本上我想要这样的东西,
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, ??);
文档很少,我很困惑,如果有任何帮助,我将不胜感激。
谢谢!
最佳答案
我能想到的最简单的解决方案是:
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 万行,您可以尝试以下方法:
- 通过 jsc.emptyRDD() 创建一个空的 rdd
- 通过repartition设置分区,创建10个分区
- 使用 mapPartition 函数创建 100 万/10 个分区 = 每个分区 100000 行。您的 RDD 已准备就绪。
旁注:
- 公开 RandomRDDs.randomRDD() 类会使事情变得更简单,但不幸的是,事实并非如此。
- 但是,RandomRDDs.randomVectorRDD() 是公开的,因此如果您需要生成随机 vector ,您可以使用它。 (但你在这里要求字符串,所以这不适用)。
关于java - 如何在 Java Spark 中生成随机 RDD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32594698/