Почему запрос CTAS в улье не дает ожидаемого результата? - PullRequest
0 голосов
/ 15 марта 2019

В данном случае я создаю «тест» для таблицы улья из 100 строк.

Когда я запускаю терминал улья и ввожу следующий SQL

select * from test tablesample(2 percent);

, он возвращает 3 строкиdata;

Но когда я добавляю «создать таблицу как Select», как показано ниже.

create table sample as select * from test tablesample(2 percent);

Я обнаружил, что в таблице «sample» есть 100 строк.

Iне знаю почему.

Большое спасибо.

1 Ответ

0 голосов
/ 15 марта 2019

Документация говорит, что TABLESAMPLE (n PERCENT) позволит Hive подобрать как минимум n% размера данных ( обратите внимание, что это не обязательно означает количество строк ) в качестве входных данных.Если мы не сможем сэмплировать его, входом задания MapReduce будет вся таблица / раздел.Мы делаем это на уровне блоков HDFS, чтобы размер выборки составлял размер блока .Например, если размер блока составляет 256 МБ, даже если n% от входного размера составляет всего 100 МБ, вы получите 256 МБ данных.

К сожалению, это не гарантирует выборку каждый раз одинаковых блоков, всего row_countможет варьироваться.

Я предлагаю увеличить процент и добавить limit n, чтобы гарантировать n возвращаемых строк.Или просто используйте limit n:

select * from test tablesample(5 percent) limit 100; --may perform faster

или

select * from test limit 100;

Лимит, конечно, работает менее эффективно, чем табличная выборка, потому что лимит работает на редукторе, может быть, как табличная выборка, так и лимит в сочетании обеспечат приемлемую производительность.

...