Presto - сокращение массива структур - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь уменьшить массив сложных типов, однако я сталкиваюсь с синтаксической ошибкой (может быть, это даже не поддерживается?).

SYNTAX_ERROR: line 2:1: Unexpected parameters (array(row(count 
double,name varchar)), integer, 
com.facebook.presto.sql.analyzer.TypeSignatureProvider@16881774, 
com.facebook.presto.sql.analyzer.TypeSignatureProvider@1718b83d) for 
function reduce. Expected: reduce(array(T), S, function(S,T,S), 
function(S,R)) T, S, R

Сложный тип определен как counters array<struct<count:double,name:string>> в таблице. Я попытался выбрать reduce(counters, 0, (state, counter) -> state + counter.count , s -> s) и reduce(counters, 0, (state, counter) -> state + counter['count'] , s -> s), однако ни одна из них не работает.

1 Ответ

0 голосов
/ 28 июня 2018

Ваш подход правильный (проверено с помощью Presto 0.205):

presto:default> desc t;
  Column  |                  Type                  | Extra | Comment
----------+----------------------------------------+-------+---------
 counters | array(row(count double, name varchar)) |       |


presto:default> select * from t;
                  counters
--------------------------------------------
 [{count=1.0, name=a}, {count=2.0, name=b}]

presto:default> select reduce(
        counters, 0,
        (state, counter) -> state + counter.count,
        state -> state) from t;
 _col0
-------
   3.0
(1 row)

Вы отметили вопрос prestodb и amazon-athena. Если вы пытаетесь сделать это на Афине, имейте в виду, что Athena основана на Presto 0.172 (выпущенной в апреле 2017 года)

...