2016-04-22 3 views
2

enter image description hereСреднее количество элементов в наборе в улье?

У меня есть два столбца id и сегмент. Сегмент представляет собой набор строк, разделенных запятыми. Мне нужно найти среднее число сегментов во всей таблице. Один из способов сделать это с помощью двух отдельных запросов -

A - select count(*) from table_name; 
B - select count(*) from table_name LATERAL VIEW explode(split(segment, ',') lTable AS singleSegment where segment != "" 
avg = B/A 

Ответ будет 8/4 = 2 в приведенном выше случае.

Есть ли лучший способ достичь этого?

ответ

2

Try:

select sum(CASE segment 
      WHEN '' THEN 0 
      ELSE size(split(segment,',')) 
      END 
      )*1.0/count(*) from table_name; 

Если поле идентификатор является уникальным, и вы хотите, чтобы добавить фильтр к части сегмента или защиты от других некорректных segment ценности, как a,b, и a,,b, вы могли бы сделать:

SELECT SUM(seg_size)*1.0/count(*) FROM (
    SELECT count(*) as seg_size from table_name 
    LATERAL VIEW explode(split(segment, ',')) lTable AS singleSegment 
    WHERE trim(singleSegment) != "" 
    GROUP BY id 
) sizes 

Затем вы можете добавить другие вещи в предложение where.

Но этот запрос выполняет два задания Hive для работы по сравнению с одним для более простого запроса и требует, чтобы поле id было уникальным.

+0

Более длинная версия запроса выше работает нормально. Благодаря !! – BlitzKrieg

+0

Да, я удалил неправильный первый запрос, так что вы действительно имеете в виду более короткий запрос, теперь :) @BlitzKrieg. Более длинный запрос будет медленнее, но он предлагает еще большую гибкость. –

Смежные вопросы