Nano Hash - криптовалюты, майнинг, программирование

поддержка подзапросов Spark SQL Scala DSL

Поддерживает ли SparkSQL подзапрос? указано, что в настоящее время поддержка подзапросов для spark 2.0 недоступна.

Это изменилось в последнее время?

29.07.2018

  • lowdnocloudreferrer-data. databricks.com/public/ указывает, что подзапросы в любом случае преобразуются в LEFT OUTER JOIN. Таким образом, неиспользование подзапроса в первую очередь (но соединение) не должно приводить к снижению производительности. РЕДАКТИРОВАТЬ: предположение является коррелированным/зависимым подзапросом. 29.07.2018

Ответы:


1

Ваш комментарий правильный. Ваш вопрос немного расплывчатый. Тем не менее, я принимаю вашу точку зрения и считаю, что концепции также хороши, а также подвержены такого рода вопросам, так что вот.

Итак, теперь это возможно для 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, в любом случае. За исключением того, что это не столь очевидно для всех, как ни странно.

29.07.2018
  • Но это просто текстовый sql-запрос. Не использовать scala dsl 29.07.2018
  • Spark предлагает (даже для нетипизированного API DataFrame) scala DSL (который немного более осведомлен о компиляторе/безопасен для типов) spark.apache.org/docs/latest/ и как вы продемонстрировали текстовый SQL API. Интересно, что подзапросы также можно конструировать в scala DSL API или, как уже было сказано выше, поскольку они в любом случае переводятся в LEFT JOIN, просто следует присоединиться к ним вручную. 30.07.2018
  • Обновленный ответ. 30.07.2018
  • который по-прежнему использует только текстовый API. 30.07.2018
  • Вот как это работает, Георг. Я буду рад исправить. 30.07.2018
  • Это невозможно, почему вы не можете принять это? У тебя высокий рейтинг, так что я думаю, ты довольно умный. Подумайте: как бы вы попытались выполнить сложный запрос нетекстовым образом? val wcounts7 = CWordsDS.where( ($Value =!= Humpty) || ($Value =!= Dumpty)) .groupBy($Value) .agg(count($Value) Это настолько хорошо, насколько это возможно. Кажется вроде очевидно для меня. 04.08.2018
  • То, что вы описываете, является ответом на некоррелированные подзапросы. Меня интересуют коррелированные подзапросы, но тем временем я понял, что левое соединение двух наборов данных вручную приводит к тому же результату. Смотрите первоначальный комментарий. Вы можете использовать это как свой ответ, и тогда я могу принять его. Мне также было бы очень интересно узнать, что будет делать катализатор в таком случае с отфильтрованным фреймом данных, когда кеширование включено. Я каким-то образом могу заставить его кэшировать только один, а не оба, т.е. Полный и отфильтрованный кадр данных. 05.08.2018
  • Но они пока невозможны для DSL. Существует как минимум 2 способа оптимизации подзапросов, которые являются вложенными и коррелированными. Интересно, что большинство людей склонны думать, что вложенные корреляции связаны между собой. Документ искры отсутствует на Catalyst. Я запускаю свои собственные запросы, чтобы увидеть, насколько хорош вложенный коррелированный подзапрос в tempviews. 05.08.2018
  • Я думаю, что мой ответ - достаточно бага капота, посмотрю сегодня вечером. 05.08.2018
  • хорошо, что не капюшон. Я проверю на databricks. Я кэшировался с сохранением, работающим нормально со случайно сгенерированными данными, которые мне нужно было сохранить. Но я свяжусь с вами, чтобы подтвердить, что второго случая может и не быть - на всякий случай! 05.08.2018
  • Обновленный ответ. 05.08.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..