Поддерживает ли SparkSQL подзапрос? указано, что в настоящее время поддержка подзапросов для spark 2.0 недоступна.
Это изменилось в последнее время?
Поддерживает ли SparkSQL подзапрос? указано, что в настоящее время поддержка подзапросов для spark 2.0 недоступна.
Это изменилось в последнее время?
LEFT OUTER JOIN
. Таким образом, неиспользование подзапроса в первую очередь (но соединение) не должно приводить к снижению производительности. РЕДАКТИРОВАТЬ: предположение является коррелированным/зависимым подзапросом. 29.07.2018 Ваш комментарий правильный. Ваш вопрос немного расплывчатый. Тем не менее, я принимаю вашу точку зрения и считаю, что концепции также хороши, а также подвержены такого рода вопросам, так что вот.
Итак, теперь это возможно для DataFrame API, а не для DataSet или DSL, как вы утверждаете.
SELECT A.dep_id,
A.employee_id,
A.age,
(SELECT MAX(age)
FROM employee B
WHERE A.dep_id = B.dep_id) max_age
FROM employee A
ORDER BY 1,2
Пример, заимствованный из Интернета, ясно показывает различие между DS и DF, подразумевая, что коррелированный подзапрос SPARK SQL (конечно, не показанный здесь) также не происходит с набором данных - путем вывода:
sql("SELECT COUNT(*) FROM src").show()
val sqlDF = sql("SELECT key, value FROM src WHERE key < 10 ORDER BY key")
val stringsDS = sqlDF.map {case Row(key: Int, value: String) => s"Key: $key, Value: $value"}
stringsDS.show()
SQL работает с каким-либо источником, таким как Hive или Parquet, или с SPARK TempView, а не с DS. Из DF вы можете перейти к DS, а затем насладиться более безопасным подходом, но только с ограниченным интерфейсом при выборе. Я сделал хороший поиск, чтобы найти что-то, что опровергает это, но это не так. DS и DF в любом случае взаимозаменяемы, как я уже говорил вам ранее. Но, я вижу, вы очень щепетильны!
Более того, существует по крайней мере 2 метода преобразования Nested-Correlated=Subqueries в «обычные» JOIN, что SPARK и другие оптимизаторы делают в фоновом режиме. Например. RewriteCorrelatedScalarSubquery и PullupCorrelatedPredicate.
Но для DSL, на который вы ссылаетесь, вы можете переписать свой запрос вручную, чтобы добиться того же, используя JOIN, LEFT JOIN, OUTER JOIN, в любом случае. За исключением того, что это не столь очевидно для всех, как ни странно.