Spark / Scala RDD加入总是给我空结果

时间:2016-03-10 01:32:13

标签: scala apache-spark rdd

我一直在玩Spark,我发现我的加入操作不起作用。以下是我的代码的一部分,结果是scala控制台:

scala> val conf = new SparkConf().setMaster("local[*]").setAppName("Part4")
scala> val sc = new SparkContext(conf)


scala> val k1 = sc.parallelize(List((1,3),(1,5),(2,4)))
k1: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[24] at parallelize at <console>:29

scala> val k2 = sc.parallelize(List((1,'A'),(2,'B')))
k2: org.apache.spark.rdd.RDD[(Int, Char)] = ParallelCollectionRDD[25] at parallelize at <console>:29

scala> val k3 = k1.join(k2)
k3: org.apache.spark.rdd.RDD[(Int, (Int, Char))] = MapPartitionsRDD[28] at join at <console>:33

scala> k3.foreach(println)

scala> k3.collect
res33: Array[(Int, (Int, Char))] = Array()

所以我刚创建了一个玩具示例,其中包含两个rdd列表k1和k2与(k,v)对,并尝试加入它们。但是,结果k3始终为空。我们可以看到k1和k2被正确指定但是k3仍然是空的。

有什么问题?

-------更新我的问题: 我想我知道问题出在哪里,但我仍然感到困惑:

起初我写了

 val conf = new SparkConf().setMaster("local[*]").setAppName("Part4")
 val sc = new SparkContext(conf)

当我没有这两行代码时,我的加入工作正常,但是当我添加它们时,它就无法工作。 那是为什么?

1 个答案:

答案 0 :(得分:1)

val sc = new SparkContext(conf)启动它自己的Spark Context。 Alas Spark不喜欢在同一个应用程序中运行多个上下文。当我在spark-shell中执行第二行(SNIP LOTS OF ERROR LINES org.apache.spark.SparkException: Only one SparkContext may be running in this JVM (see SPARK-2243). To ignore this error, set spark.driver.allowMultipleContexts = true. The currently running SparkContext was created at: org.apache.spark.SparkContext.<init>(SparkContext.scala:82) SNIP LOTS OF ERROR LINES )时,我得到了

{{1}}

Spark有很多静态上下文和其他东西,这意味着当你有两个上下文时它不起作用。我把它归结为那个但是我无法证明这一点。