在本地并行运行Java spark程序

v9tzhpje  于 2023-08-06  发布在  Apache
关注(0)|答案(1)|浏览(121)

我是spark的新手,我试图在本地运行示例JavaWordCount表单spark git repo。SparkSession看起来像:

SparkSession spark = SparkSession
        .builder()
        .master("local[*]")
        .appName("JavaWordCounter.com")
        .getOrCreate();

字符串
虽然我的CPU有12个线程。程序只运行在一个
我试过SparkConf。parallelize可以很好地使用List:

List<String> inputData = new ArrayList<>();
        inputData.add("WARN: Tuesday 4 September 0405");
        inputData.add("ERROR: Tuesday 4 September 0408");
        inputData.add("FATAL: Wednesday 5 September 1632");
        inputData.add("ERROR: Friday 7 September 1854");
        inputData.add("WARN: Saturday 8 September 1942");

SparkConf conf = new SparkConf().setAppName("newSpark").setMaster("local[*]");
JavaSparkContext sc = new JavaSparkContext(conf);

JavaRDD<Integer> myRdd = sc.parallelize(inputData);


但是当inputData是本地文件时

SparkConf conf = new SparkConf().setAppName("newSpark").setMaster("local[*]");
JavaSparkContext sc = new JavaSparkContext(conf);

JavaRDD<String> inputData = sc.textFile("src/main/resources/names.txt");
JavaRDD<Integer> myRdd = sc.parallelize(inputData);


我得到以下错误:

java: no suitable method found for parallelize(org.apache.spark.api.java.JavaRDD<java.lang.String>)
    method org.apache.spark.api.java.JavaSparkContext.<T>parallelize(java.util.List<T>,int) is not applicable
      (cannot infer type-variable(s) T
        (actual and formal argument lists differ in length))
    method org.apache.spark.api.java.JavaSparkContext.<T>parallelize(java.util.List<T>) is not applicable
      (cannot infer type-variable(s) T
        (argument mismatch; org.apache.spark.api.java.JavaRDD<java.lang.String> cannot be converted to java.util.List<T>))

bbmckpt7

bbmckpt71#

sc.textFile("src/main/resources/names.txt")的输出已经返回了一个JavaRDD<String>,它本身已经是一个分布式对象。
在RDD上尝试sc.parallelize并没有真正意义:这就像试图从一个已经分布的对象中创建一个分布对象。
如果你想把JavaRDD<String>转换成JavaRDD<Integer>,你可以使用.map函数,类似于下面的代码(我从来没有使用过Java API,所以请原谅我可能的语法错误):

JavaRDD<String> inputData = sc.textFile("src/main/resources/names.txt");
JavaRDD<Integer> myRdd = inputData.map(x -> x.toInt());

字符串

相关问题