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


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

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

Date: 2023-12-03 07:18 pm (UTC)
From: [personal profile] sassa_nf
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.

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

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

Date: 2023-12-05 01:03 am (UTC)
From: [personal profile] ichthuss
Є:
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 Date: 2023-12-05 01:04 am (UTC)

Date: 2023-12-05 08:22 pm (UTC)
From: [personal profile] ichthuss
З мого не дуже широкого досвіду, через хитровивернутий 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,...
Тоді помилка найчастіше все одно вилізає, але уже з притомним поясненням.

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

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

Profile

malyj_gorgan: (Default)
malyj_gorgan

June 2025

S M T W T F S
12 345 67
89 1011 121314
151617181920 21
22232425262728
2930     

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 21st, 2025 02:10 pm
Powered by Dreamwidth Studios