Среднее количество элементов в наборе в улье?
У меня есть два столбца 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 ответ:
Попробуйте:
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 было уникальным.