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-03 07:38 am (UTC)(link)
It would help if you could mention imports (so it would be possible to search for docs) and example line of code. Looking for dataframe Spark docs pop up. They don't have .column or .when().

[personal profile] sassa_nf 2023-12-03 07:05 pm (UTC)(link)
Ні, org.apache - це опенсорс

[personal profile] sassa_nf 2023-12-03 07:18 pm (UTC)(link)
Ok, I don't see dataframe.column in the docs, so it can't be helped.

But it looks like it is a Java library natively accessed from scala, so I wouldn't expect || to be defined for it.

[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)
А! Справді! Дякую