Логарифмическая логистика c отличается от ожидаемой - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь присвоить статус на основе количества идентификаторов, используя метрику c. Это запрос, который я написал (и он работает):

select
    x.yyyy_mm_dd,
    x.prov_id,
    x.app,
    x.metric,
    x.is_100,
    case
        when ((x.is_100 = 'true') or size(collect_set(x.list)) >10) then 'implemented'
        when ((x.is_100 = 'false') and size(collect_set(x.list)) between 1 and 10) then 'first contact'
        else 'no contact'
    end as impl_status,
    size(collect_set(x.list)) as array_size,
    collect_set(x.list) as list
from(
    select
        yyyy_mm_dd,
        prov_id,
        app,
        metric,
        is_100,
        list
    from
        my_table
        lateral view explode(ids) e as list           
) x
group by
    1,2,3,4,5

Однако impl_status неверно для второго условия в операторе case. В результирующем наборе я вижу строки с is_100 = false, array_size от 1 до 10, однако impl_status в итоге оказывается «без контакта» вместо «первого контакта». Я думал, может быть, между не включается, но, похоже, в соответствии с документами.

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Мне любопытно, работает ли это:

(case when x.is_100 or count(distinct x.list) > 10
      then 'implemented'
      when (not x.is_100) and count(x.list) > 0 
      then 'first contact'
      else 'no contact'
 end) as impl_status,

Это должны быть те же логики c без сравнения строк - здесь - интересная точка зрения на логические значения в Hive. Я также думаю, что COUNT() понятнее, чем функциональность массива.

0 голосов
/ 01 мая 2020

Убедитесь, что в строке нет скрытого пространства

when (( trim(x.is_100) = 'false') and size(collect_set(x.list)) between 1 and 10) then 'first contact'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...