带行的顺序数组

Order array with rows

我尝试使用 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}]

第二行return另一个结果

[{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 版本中,您可以使用带有 lambda 函数的 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 is based in Presto 0.172, so this array_sort variant is not available 而你需要做这样的事情:

  1. 交换 ROW 类型的边,使 confidence 排在第一位
  2. 排序数组
  3. 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)))
....