GREL

Материал из Поле цифровой дидактики
Версия от 19:54, 16 апреля 2026; Patarakin (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)


Краткое описание языка GREL (Google/General Refine Expression Language) — это выражения, которые используются в OpenRefine для фильтрации, преобразования и агрегирования данных в ячейках и столбцах. По смыслу GREL для OpenRefine играет ту же роль, что формулы для Excel или SQL‑запросы для баз данных: позволяет выполнять более сложные операции, чем доступно через стандартные пункты меню.
Компетенции в каких сферах формирует
Парадигмы программирования
Возрастная категория
Назначение языка (Общее / Учебное)
Visual_Text_Blocks
Измерение (2D/3D/Tangible)
Область знаний
Открытость продукта Открытый
Address
Предки (Ancestors) JavaScript
Потомки (Descendants)
Активность в данный момент Project is active
Доступны ремиксы? Нет
Год создания
Создатели
Поясняющее видео
Используется для создания мобильных приложений? Нет


GREL упоминается в свойствах следующих страниц


GREL (Google/General Refine Expression Language) — это выражения, которые используются в OpenRefine для фильтрации, преобразования и агрегирования данных в ячейках и столбцах. По смыслу GREL для OpenRefine играет ту же роль, что формулы для Excel или SQL‑запросы для баз данных: позволяет выполнять более сложные операции, чем доступно через стандартные пункты меню.

GREL по синтаксису близок к JavaScript и работает с теми же типами данных, что и таблица OpenRefine: строки, числа, даты, массивы, [[JSON[[‑объекты. Основная переменная — `value` (значение текущей ячейки), но в выражениях можно обращаться и к другим столбцам через `cells["ColumnName"].value`.

В OpenRefine GREL можно использовать в четырёх основных контекстах:

  • создание Custom text / numeric facet (собственные фасеты на основе выражения);
  • Transform → Edit cells → Transform… (преобразование значений в столбце);
  • Edit column → Add column based on this column… (создание нового столбца на основе выражения);
  • некоторые расширенные операции (например, при Fetch URL) также используют GREL как язык выражений.
GREL полезен для
  • подготовки временных рядов (извлечение года/месяца из даты, агрегация по дате);
  • конструирования панели `объект × время` (например, `user, board_id, year`);
  • очистки текстовых категорий, работы с JSON‑массивами и вложенными объектами;
  • вычисления агрегатов (сумма, количество) по группе строк.


Таблица подсказок по GREL в OpenRefine

Контекст: что хотим сделать Где и в каком режиме Пример Expression (GREL)
Преобразовать текстовую дату в тип Date (для временных рядов) Меню столбца с датой → Edit cells → Common transforms → To date (выбор GREL не нужен, но важно понимать, что OpenRefine внутри применяет преобразование типа) (автоматическое преобразование ISO‑строки, например `"2022-07-06T06:37:06Z"`)

— отдельное выражение не вводим

Вытащить год из даты в новый столбец (переменная времени \(t\)) Меню столбца с датой → Edit column → Add column based on this column… → язык: GREL
value.toDate().toString("yyyy")

Создаёт столбец `year` с годом, используемым как временной индекс

Построить строковое представление «год‑месяц» (для месячных рядов) Меню столбца с датой → Add column based on this column…
value.toDate().toString("yyyy-MM")

Например, "2024-03"

Очистить пробелы в начале/конце и узнать длину строки Меню столбца с текстом → Edit cells → Transform…
value.trim().length()

Полезно для диагностики «грязных» строк, где есть лишние пробелы

Заменить подстроку (очистка категорий) Меню столбца → Edit cells → Transform…
value.replace("old","new")

Например, объединить разные варианты написания категорий

Объединить значения двух столбцов (конструирование идентификатора панели) Меню любого из столбцов → Edit column → Add column based on this column…
cells["user"].value + "_" + cells["board_id"].value

Создаёт composite key вида "user_board", удобный для группировок

Превратить JSON‑массив в строку с разделителем (подготовка к Split multi-valued cells) Меню столбца с массивом (например, idBoards) → Edit cells → Transform…
value.join("|")

После этого используем Edit cells → Split multi-valued cells… с разделителем |

Посчитать количество строк с той же парой user–board (агрегация по ключу) В режиме Rows, любой столбец → Edit column → Add column based on this column…
length(
  filter(
    rows,
    r,
    r.cells["user"].value == cells["user"].value &&
    r.cells["board_id"].value == cells["board_id"].value
  )
)

Даёт частоту пары (аналог COUNT(*) GROUP BY user, board_id)

Посчитать сумму числового показателя по user–board (например, events) Аналогично: Add column based on this column…, предварительно столбец events → To number
sum(
  forEach(
    filter(
      rows,
      r,
      r.cells["user"].value == cells["user"].value &&
      r.cells["board_id"].value == cells["board_id"].value
    ),
    r, r.cells["events"].value
  )
)

Аналог SUM(events) GROUP BY user, board_id

Фильтровать строки, где значение содержит подстроку (кастомный facet) Меню столбца → Facet → Custom text facet…
value.contains("wiki_edit")

Возвращает true/false для фасета, удобно для выделения определённых типов событий