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


Введите описание изображения здесь

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

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 в приведенном выше случае.

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

1 ответ:

Попробуйте:

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

Если ваше поле id уникально, и вы хотите добавить фильтр к части сегмента или защитить от других искаженных значений 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 было уникальным.