Как передать переменные в spark SQL, используя SparkR? - PullRequest
0 голосов
/ 26 марта 2020

Я новичок в SparkR. Я пытаюсь написать запрос к набору данных, используя SparkR, используя Qubole Notebook. выполняется несколько процессов, но не получается вывод.

Данные: Таблица_A

ID      Name     month      year
1        A         2        2020
2        B         2        2019
3        c        12        2019

Желаемый вывод:

ID      Name     month      year
1        A         2        2020

enter image description here

Код:

month_value = 2 year_value = 2020

Процесс 1:

temp_data = sql ("выбрать * из таблицы_A, где month = $ month_value и year = $ year_value")

Процесс 2:

temp_data = sql (s "select * from Table_A, где month = $ month_value и year = $ year_value")

Процесс 3:

temp_data = sql ("выберите * из таблицы_A, где месяц = ​​{0} и год = {1}". Формат (значение_месяца, значение года))

Процесс 4:

temp_data = sql ("выберите * из таблицы_A, где month = $ {month_value} и year = $ {year_value}")

Пожалуйста, помогите мне решить эту проблему. Спасибо в adv.

1 Ответ

0 голосов
/ 05 апреля 2020

Фильтрацию можно выполнить с помощью предложения where в функции sql или напрямую с помощью функции filter.

Настройка с данными образца:

library(SparkR, lib.loc = c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib")))
sparkR.session(master = "local[*]", sparkConfig = list(spark.driver.memory = "8g"))

local_df <- data.frame(ID=c(1, 2 ,3),
                       Name=c("A", "B", "c"),
                       month=c(2, 2, 12), 
                       year=c(2020, 2019, 2019))

month_value <- 2
year_value <- 2020

sdf <- createDataFrame(local_df)

Первый подход с использованием sql. Создайте временное представление из SparkDataFrame с именем sdf. Затем вы можете использовать glue для составления кода sql. Это строковый интерполятор, который чище, чем при использовании paste.

# 1) SQL function (string interpolation)
createOrReplaceTempView(sdf, "Table_A")
(sql_expanded <- as.character(glue::glue(
  "select * from Table_A where (month == {month_value}) and (year == {year_value})")))
head(sql(sql_expanded))

Результат:

> (sql_expanded <- glue::glue(
+   "select * from Table_A where (month == {month_value}) and (year == {year_value})"))
select * from Table_A where (month == 2) and (year == 2020)
> head(sql(as.character(sql_expanded)))
  ID Name month year
1  1    A     2 2020

Второй вариант с использованием filter

> head(filter(sdf, sdf$month == month_value & sdf$year == year_value))
  ID Name month year
1  1    A     2 2020
...