Это концептуальный вопрос ...
Представьте у вас есть большой кластер, состоящий из многих рабочих скажут n
рабочих и те работники хранят переборку RDD
или DataFrame
, представьте Вы начинаете map
задачу по что данные, и внутри этого map
у вас есть print
заявление, прежде всего:
- Где эти данные распечатываются?
- Какой узел имеет приоритет и какой раздел?
- Если все узлы работают параллельно, кто будет печататься первым?
- Как будет создана очередь печати?
Это слишком много вопросов, таким образом, конструкторы/Сопровождающие из apache-spark
решил логически отказаться от любой поддержки print
операторов внутри любой map-reduce
операции (это включает accumulators
и даже broadcast
переменные).
Это также имеет смысл, потому что Spark - это язык , рассчитанный на для очень больших наборов данных. Хотя печать может быть полезна для тестирования и отладки, вы не захотите печатать каждую строку DataFrame или RDD, потому что они созданы, чтобы иметь миллионы или миллиарды строк! Итак, зачем решать эти сложные вопросы, когда вы даже не хотите печатать в первую очередь?
Чтобы доказать это, вы можете запустить этот SCALA код, например:
// Let's create a simple RDD
val rdd = sc.parallelize(1 to 10000)
def printStuff(x:Int):Int = {
println(x)
x + 1
}
// It doesn't print anything! because of a logic design limitation!
rdd.map(printStuff)
// But you can print the RDD by doing the following:
rdd.take(10).foreach(println)
Почему он работает? – angelcervera
Поскольку Spark считает, что он вызывает функцию Utility вместо вызова функции печати. Спарк, по-видимому, не (и не мог) проверить каждую строку в своей функции полезности. – Edamame
Что вы делаете, это создать экземпляр объекта в вашей программе драйверов. Я бы не стал рассчитывать на это поведение без четкой модели того, что происходит. Ожидайте, что поведение изменится непредсказуемо с любыми изменениями в вашей программе или тем, как вы вызываете объект PrintUtility. Если вы хотите собирать журналы, используйте стандартные методы для этого, не изобретайте случайные механизмы, которые вы не понимаете. Ваше объяснение, почему это работает, опасно неправильно - нет запрета делать то, что вы сделали; нет проверки кода, чтобы убедиться, что вы не обманываете: все поведение следует за дизайном системы – David