Как получить доступ к вложенным структурам Spark из SQL (не DSL) - PullRequest
0 голосов
/ 19 декабря 2018

В следующем sql необходим синтаксис для доступа к вложенному struct.

В частности, в третьей строке указано следующее:

  collect_list(struct( .. ) )

Я поставил rec.*, но это, конечно, не правильный путь.

select matchMethod, rec.* from
                              (select first(matchMethod) matchMethod,
                                collect_list(struct(rawTp,tp,fp,fn,
                                        precision,recall,weight,F1,
                                        truthGrpId,entityId,
                                        tpIds,fpIds, fnIds,truthIds,actuals)) rec
                                   from scoring5
                                      where entityId is not null and truthGrpId is not null
                                  group by truthGrpId
                              ) order by rec.truthGrpId, rec.recall desc

В результате:

org.apache.spark.sql.AnalysisException: 
Can only star expand struct data types. Attribute: `ArrayBuffer(rec)`;

Были предприняты многие другие способы.Я также изучил около десяти других вопросов здесь о SOF, но ни один из них не касается непосредственно специально для SQL, а не для DSL .. Возможно ли это вообще?

Я согласеннеясно, означает ли сообщение Can only star expand struct data types, что для достижения этого может использоваться другой синтаксис, или же здесь просто есть недостаток в spark sql.

Мы используем spark 2.3.X.

1 Ответ

0 голосов
/ 19 декабря 2018

Учитывая значительные исследования, а также испытания различных комбинаций синтаксиса, я склонен согласиться с @ user6910411, что вышеизложенное в настоящее время не поддерживается.Кажется, что есть некоторая помощь в виде Spark 2.4: посмотрите этот ответ Яцека Ласковского:

В любом случае я нашел более простой подход с использованием функций windowing следующим образом:

select * from
  (select row_number() over (partition by truthGrpId order by recall desc) rownum,*
    from
    (select matchMethod, rawTp,tp,fp,fn,
        precision,recall,weight,F1,
        truthGrpId,entityId,
        tpIds,fpIds, fnIds,truthIds,actuals
      from scoring5
      where entityId is not null and truthGrpId is not null
    ) order by truthGrpId, recall desc
  ) where rownum=1 order by truthGrpId""")

enter image description here

Очевидное продолжение здесь - углубиться в функции windowing и включить их в качестве первоклассных граждан в мою исследовательскую работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...