基本上我想要这样的东西,
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, ??);
文档很少,我很困惑,我很感激任何帮助。
谢谢!
答案 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 :(得分: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来访问它。)