Я пытаюсь отсортировать массив строк с помощью функции array_sort, но результат не такой, как я хотел.
первый порядок результатов правильный
[{type=CALM, confidence=95.1536636352539}, {type=CONFUSED, confidence=1.1397864818572998}, {type=HAPPY, confidence=0.07988717406988144}, {type=SAD, confidence=1.7613277435302734}, {type=SURPRISED, confidence=0.3601384460926056}]
вторая строка возвращает другой результат
[{type=CALM, confidence=0.5053133368492126}, {type=CONFUSED, confidence=0.4852835536003113}, {type=HAPPY, confidence=92.1430892944336}, {type=SAD, confidence=1.6924850940704346}, {type=SURPRISED, confidence=3.10842227935791}]
Ожидаемый результат во второй строке:
[
{type=HAPPY, confidence=92.1430892944336},
{type=SURPRISED, confidence=3.10842227935791},
{type=SAD, confidence=1.6924850940704346},
{type=CALM, confidence=0.5053133368492126},
{type=CONFUSED, confidence=0.4852835536003113}]
Возможна сортировка по достоверности?
В более новой версии Presto вы можете использовать функцию array_sort
, которая принимает лямбда-функцию (например, сортировку в Java с помощью компаратора):
SELECT array_sort(array_or_rows,
(a, b) -> IF(a[2] < b[2], 1, IF(a[2] = b[2], 0, -1))
...
Тем не менее, Athena основан в Престо 0,172, так что это array_sort
вариант недоступно, и вместо этого вам нужно сделать что-то вроде этого:
ROW
так, чтобы confidence
был первымROW
обратноНапример.:
SELECT
transform(
array_sort(
transform(
array_or_rows,
r -> CAST(r AS ROW(confidence double, type varchar)))),
r -> CAST(r AS ROW(type varchar, confidence double)))
....