Spark tries to keep things in memory, whereas MapReduce keeps shuffling things in and out of disk.
Среднее промежуточное хранилище в основной памяти, где в качестве промежуточного результата в промежуточной памяти используется промежуточное хранилище. MapReduce вставляет барьеры, и требуется много времени, чтобы написать вещи на диск и прочитать их обратно. Следовательно MapReduce может быть медленным и трудоемким. Устранение этого ограничения ускоряет порядок Spark. Для таких вещей, как SQL-движки, такие как Hive, обычно требуется цепочка операций MapReduce, и для этого требуется много операций ввода-вывода. На диск, с диска на диск, с диска. Когда подобные операции запускаются на Spark, Spark может хранить вещи в памяти без ввода-вывода, поэтому вы можете быстро работать с одними и теми же данными. Это приводит к резкому повышению производительности, и это означает, что Spark определенно перемещает нас по крайней мере в интерактивную категорию. Для записи есть некоторые преимущества, которые MapReduce выполняет всю эту запись на диск - так как запись всего на диск позволяет перезапустить после сбоя. Если вы используете многочасовую работу, вы не хотите начинать с нуля. Для приложений на Spark, которые работают в секундах или минутах, перезапуск, очевидно, не является проблемой.
It’s easier to develop for Spark
. Spark является гораздо более мощным и выразительным с точки зрения того, как вы даете ему инструкции по сжатию данных. У Spark есть функция Map и Reduce, такая как MapReduce, но она добавляет другие, такие как Filter, Join и Group-by, поэтому ее легче разрабатывать для Spark.
Spark also adds libraries for doing things like machine learning, streaming, graph programming and SQL
После того как Вы получаете больше чем несколько они, затем да: это начинает становиться довольно медленным. В таких случаях я склонен использовать сгенерированный TSQL - т.е.
DECLARE @sql nvarchar(4000)
SET @sql = /* core query */
IF @name IS NOT NULL
SET @sql = @sql + ' AND foo.Name = @name'
IF @dob IS NOT NULL
SET @sql = @sql + ' AND foo.DOB = @dob'
// etc
EXEC sp_ExecuteSQL @sql, N'@name varchar(100), @dob datetime',
@name, @dob
и т.д.
Примечание, что sp_ExecuteSQL планы запросов кэшей, таким образом, любые запросы с тем же args могут потенциально снова использовать план.
оборотная сторона - это, если Вы не подписываете SPROC, полномочия ВЫБОРА потребностей вызывающей стороны на таблице (не только ИСПОЛНИТЕЛЬНЫЕ полномочия на SPROC).
Я обработал бы его этот путь.
WHERE Thing = ISNULL(@Thing, Thing)
, Если Вы просто используете параметр в качестве фильтра на, где пункт, это будет работать очень хорошо. Это проигнорирует параметр, если это будет пустым.
Я обычно использую
WHERE (id = @id OR @id IS NULL)
AND (num = @num OR @num IS NULL)
и т.д.
Техника I’ve, используемый в прошлом для этого сценария, состоит в том, чтобы использовать ОБЪЕДИНИТЬ функцию как часть моего оператора Where. Книги Онлайн обеспечат больше подробно информацию о функции, но here’s отрывок того, как можно использовать его в сценарии, который Вы описали:
create procedure usp_TEST_COALESCE
(
@parm1 varchar(32) = null,
@parm2 varchar(32) = null,
@parm3 int = null
)
AS
SELECT *
FROM [TableName]
WHERE Field1 = COALESCE(@parm1, Field1)
AND Field2 = COALESCE(@parm2, Field2)
AND Field3 = COALESCE(@parm3, Field3)
ОБЪЕДИНИТЬ функция возвратит первое ненулевое выражение из своих аргументов. В примере выше, если какой-либо из параметров является пустым, ОБЪЕДИНИТЬ функция будет использовать значение в базовом поле.
Один важный протест к использованию этой техники состоит в том, что базовые поля в таблице (которые составляют Ваш, где пункт) должны быть не допускающими NULL-значения.
Я не уверен, является ли это 'оптимальный' путь, но это точно, что я делаю в своих хранимых процедурах в тех же целях. Мое инстинктивное чувство состоит в том, что это быстрее, чем динамично созданный запрос просто с точки зрения плана выполнения. Другая опция состоит в том, чтобы создать запрос для каждой комбинации этих "флагов", в которых Вы являетесь передающими, но это действительно не то, что масштабируемо.
Это - метод, который я обычно использую. Я не вижу оснований для него, чтобы быть неэффективным, поскольку оператор должен закоротить к истинному, если бы @thing является пустым, и поэтому не потребовал бы сканирования таблицы. У Вас есть какое-либо доказательство, что это сравнение замедляет Ваш запрос? В противном случае я не волновался бы об этом.
когда Вы объявляете параметры, если Вы устанавливаете значение им, такое как пустой указатель в Вашем случае, Вы не должны передавать значение в ним, если, конечно, Вы не должны. Я использую эту способность отметить, если другой запрос должен быть выполнен, особые случаи, когда параметр не пустой
, я обычно просто проверяю его как это
ЕСЛИ поле IS NULL
Спасибо, это было полезно. Я решил использовать метод SP_EXECUTECL из-за упомянутых потенциальных преимуществ производительности. У меня немного другой, который вы можете найти полезным.
DECLARE @sql nvarchar(4000)
DECLARE @where nvarchar(1000) =''
SET @sql = 'SELECT * FROM MyTable'
IF @Param1 IS NOT NULL
SET @where = @where + ' AND Field1 = @Param1'
IF @Param2 IS NOT NULL
SET @where = @where + ' AND Field2 = @Param2'
IF @Param3 IS NOT NULL
SET @where = @where + ' AND Field3 = @Param3'
-- Add WHERE if where clause exists, 1=1 is included because @where begins with AND
IF @where <> ''
SET @sql = @sql + ' WHERE 1=1' + @where
--Note that we could also create order parameters and append here
SET @sql = @sql + ' ORDER BY Field1'