Я получаю ошибку & ldquo; В этом RDD отсутствует SparkContext & rdquo; когда я вызываю преобразования или действия [duplicate]

Посмотрите на этот пример:

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope,$http) {

    var getJoke = function(){
        return $http.get('http://api.icndb.com/jokes/random').then(function(res){
            return res.data.value;  
        });
    }

    getJoke().then(function(res) {
        console.log(res.joke);
    });
});

Как вы можете видеть, getJoke возвращает разрешенное обещание (оно разрешено при возврате res.data.value). Таким образом, вы ждете, пока запрос $ http.get не будет завершен, а затем выполнится console.log (res.joke) (как обычный асинхронный поток).

Это plnkr:

http://embed.plnkr.co/XlNR7HpCaIhJxskMJfSg/

8
задан G_cy 23 April 2015 в 06:55
поделиться

2 ответа

SPARK-5063 относится к лучшим сообщениям об ошибках при попытке вложить RDD-операции, которые не поддерживаются.

Это проблема юзабилити, а не функциональная. Основной причиной является вложенность операций RDD, и решение должно разбить это.

Здесь мы пытаемся присоединиться к dRDD и mRDD. Если размер mRDD велико, rdd.join был бы рекомендованным способом, если mRDD невелик, то есть подходит в памяти каждого исполнителя, мы могли бы его собирать, транслировать и делать «карту» 'join.

JOIN

Простое объединение будет выглядеть следующим образом:

val rdd = sc.parallelize(Seq(Array("one","two","three"), Array("four", "five", "six")))
val map = sc.parallelize(Seq("one" -> 1, "two" -> 2, "three" -> 3, "four" -> 4, "five" -> 5, "six"->6))
val flat = rdd.flatMap(_.toSeq).keyBy(x=>x)
val res = flat.join(map).map{case (k,v) => v}

Если мы хотим использовать широковещательную рассылку, нам сначала нужно собрать значение таблицы разрешений локально для b / c, что для всех исполнителей. ПРИМЕЧАНИЕ: RDD, который будет транслироваться ДОЛЖЕН , вписывается в память драйвера, а также каждого исполнителя.

Соединительная сторона на стороне карты с широковещательной переменной

val rdd = sc.parallelize(Seq(Array("one","two","three"), Array("four", "five", "six")))
val map = sc.parallelize(Seq("one" -> 1, "two" -> 2, "three" -> 3, "four" -> 4, "five" -> 5, "six"->6)))
val bcTable = sc.broadcast(map.collectAsMap)
val res2 = rdd.flatMap{arr => arr.map(elem => (elem, bcTable.value(elem)))} 
11
ответ дан maasg 23 August 2018 в 23:57
поделиться

В этом RDD отсутствует SparkContext. Это может произойти в следующих случаях:

RDD преобразования и действия НЕ запускаются драйвером

, но внутри других преобразований; например, rdd1.map(x => rdd2.values.count() * x) является недопустимым, поскольку преобразование значений и действие count не могут быть выполнены внутри преобразования rdd1.map

0
ответ дан Generic 23 August 2018 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: