malyj_gorgan: (Default)
malyj_gorgan ([personal profile] malyj_gorgan) wrote2023-12-02 05:21 pm
Entry tags:

тут є любителі Скали

По роботі, через примху начальства, доводиться переписувати пару шматків коду з SQL на Скалу, тої Скали не знаючи зовсім. Але потрошки, потрошки... Проблема в тому, що це для внутрішнього нашого датастора, там компіляція/перевірка на помилки триває хвилину, а запуск найтривіальнішого коду займає хвилин 5-10, тому все помаленько дуже. Але, 80% уже готово...
...І раптом вперся в помилку, яку уже дві години не можу виправити. З того всього виглядає, що в dataframe.column.when() немає логічного "OR". Воно тупо ламається на значку "||"


Якщо це не баг, а фіча, поясніть мені, тупому, кому така фіча могла прийти в голову. І, основне, НАФІГА?

P.S. Цікаво, скільки з тих, хто користується Скалою, знає безсмертні рядки про
Лупайте сю скалу! Нехай ні жар, ні холод
Не спинять вас. Зносіть і труд, і спрагу, й голод
Бо вам призначено скалу сесю розбить.

[personal profile] sassa_nf 2023-12-04 06:26 pm (UTC)(link)
є, але то ж для булєвих виразів, а не SQL на різних конструкціях.

[personal profile] sassa_nf 2023-12-04 07:13 pm (UTC)(link)
Ну, я мав на увазі, що dataframe.column.when() має бути якимось об'єктом. На скалі об'єкти можуть мати свої "оператори" (насправді методи, але виглядають як оператори), наприклад ||, тому я й хотів глянути, що в документації про це. А там нічого такого якраз і не визначено.

[personal profile] ichthuss 2023-12-05 01:03 am (UTC)(link)
Є:
https://spark.apache.org/docs/latest/api/scala/org/apache/spark/sql/Column.html#||(other:Any):org.apache.spark.sql.Column (якщо анхор не працює, шукати за строкою "def ||(other: Any): Column").
Edited 2023-12-05 01:04 (UTC)

[personal profile] ichthuss 2023-12-05 08:22 pm (UTC)(link)
З мого не дуже широкого досвіду, через хитровивернутий type inferring скала може видавати досить загадкові повідомлення про помилки в доволі простих випадках замість банального "type mismatch". Тоді допомагає явно розписати складний вираз зі вказанням всіх проміжних типів, приблизно так - замість
expr.when(A || B,...
написати:
val a: Column = A
val b: Column = B
val a_p_b: Column = a || b
expr.when(a_p_b,...
Тоді помилка найчастіше все одно вилізає, але уже з притомним поясненням.

[personal profile] ichthuss 2023-12-06 08:01 am (UTC)(link)
Ото підозрюю, що це саме blah.blah.blah було не Column, а мав бути Column. Можливо навіть, що достатньо було б поміняти операнди місцями (якщо другий з них таки був Column).

[personal profile] sassa_nf 2023-12-05 09:06 pm (UTC)(link)
А! Справді! Дякую