Оптимизировать запрос где на Spark Scala - PullRequest
0 голосов
/ 25 декабря 2018

Я новичок в Apache Spark (и Scala) и хочу применить простой SQL-запрос сразу после чтения CSV-файла и загрузить его в DF без необходимости создания дополнительного фрейма данных, а также временного представления или таблицы.

Это начальный запрос:

SELECT DISTINCT city from cities
WHERE id IN ("10", "20")
AND year IN ("2017", "2018")

Это то, что я пробовал на Scala:

val cities = spark.read.options(Map("header" -> "true", "delimiter" -> ";")).csv("test.csv").select("city").distinct.where(""" id IN ("10", "20") AND year IN ("2017", "2018")"""))

cities.show(20)

Но это не работает.Конкретно, кажется, что проблема возникает из-за того, что он не распознал два других столбца в кадре данных (так как ранее я выбрал только один столбец).Итак, мне пришлось сначала выбрать эти три столбца, а затем сохранить временную таблицу (представление), а затем выбрать нужный столбец в новом кадре данных.Я считаю этот подход слишком длинным и слишком тяжелым.

Можете ли вы помочь мне исправить это, пожалуйста ???Спасибо!

Ответы [ 3 ]

0 голосов
/ 25 декабря 2018

API Spark Scala является более императивным, чем декларативным (в отличие от SQL), поэтому после select("city") вы потеряли все остальные поля в кадре данных.и почему, как отмечали другие, вы должны фильтровать / где, прежде чем делать выбор.Это немного сбивает с толку, так как Scala DSL по синтаксису похож на SQL

0 голосов
/ 26 декабря 2018

Как уже упоминалось sramalingam24 и Рафаэлем Ротом, where должен быть применен до выбора обязательного поля в DataFrame.Фильтр и где оба дают тот же результат, как показано ниже.DropDuplicates () удалит Дубликаты в столбце города.

    val cities = spark.read.options(Map("header" -> "true", "delimiter" -> ";"))
       .csv("test.csv")
       .filter($"id".isin("10", "20") and $"year".isin("2017", "2018"))
       .select("city")
       .dropDuplicates()
0 голосов
/ 25 декабря 2018

Ваше решение почти правильное, вам нужно просто переместить оператор where до select(..).distinct:

val cities = spark.read
  .options(Map("header" -> "true", "delimiter" -> ";"))
  .csv("test.csv")
  .where($"id".isin("10", "20") and $"year".isin("2017", "2018"))
  .select("city").distinct
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...