2013-06-14 3 views
3

В настоящее время у меня есть таблица Hive с 1,5 миллиардами строк. Я хотел бы создать меньшую таблицу (используя ту же схему таблицы) с примерно 1 миллионом строк из исходной таблицы. В идеале, новые строки будут случайным образом отобраны из исходной таблицы, но получение верхней части 1M или нижней части 1M исходной таблицы также будет в порядке. Как мне это сделать?Улей: создание таблицы меньшего размера из большого стола

ответ

5

Как было предложено ранее climbage, вы, возможно, лучше всего использовали Hive's built-in sampling methods.

INSERT OVERWRITE TABLE my_table_sample 
SELECT * FROM my_table 
TABLESAMPLE (1m ROWS) t; 

Этот синтаксис был introduced in Hive 0.11. Если вы используете более старую версию Hive, вы будете ограничены использованием синтаксиса PERCENT.

INSERT OVERWRITE TABLE my_table_sample 
SELECT * FROM my_table 
TABLESAMPLE (1 PERCENT) t; 

Вы можете изменить процент, чтобы соответствовать конкретным требованиям размера выборки.

+0

Можете ли вы подробнее рассказать о том, как использовать синтаксис выборки? Я прочитал страницу Hive, которую вы упомянули, но я все еще озадачен. Например, я хотел бы создать таблицу из 100 000 строк (из 1,5 миллиарда). Я попробовал INSERT OVERWRITE TABLE small_table AS SELECT * FROM big_table TABLESAMPLE (100k ROWS) t, но я получаю ошибку синтаксического анализа. Я также попробовал буквальный «100000» вместо «100 тыс.». – stackoverflowuser2010

+0

Какую версию улья вы используете? Я считаю, что приведенный выше синтаксис был введен в 0.11. См.: Https://issues.apache.org/jira/browse/HIVE-3401 –

+0

Я использую Hive 0.10.0.24: hive-hwi-0.10.0.24.jar – stackoverflowuser2010

1

Вы можете определить новую таблицу с той же схемой, что и исходная таблица.

INSERT OVERWRITE TABLE <tablename> <select statement> Затем используйте

ЗЕЬЕСТА нужно будет запрашивать исходную таблицу, используйте LIMIT, чтобы получить только результаты 1M.

+1

Добавление к этому, см [выборки в улье] (https://cwiki.apache.org/Hive/languagemanual-sampling.html) за помощь в построении оператора выбора с размером меньше образца – climbage

+0

бы эта работа? CREATE TABLE small_table AS SELECT * FROM big_table LIMIT 1000000 – stackoverflowuser2010

+0

Нет. Сначала вам нужно создать схему таблицы как отдельный оператор. Затем выполните INSERT OVERWRITE. – seedhead

0

Этот запрос вытащит верхние строки 1М и перезапишет их в новой таблице.

CREATE TABLE new_table_name AS 
    SELECT col1, col2, col3, .... 
    FROM original_table 
    WHERE (if you want to put any condition) limit 100000; 
Смежные вопросы