Я думаю, что вам не хватает концепции разделов. Если вы определяете таблицу как секционированную, данные могут быть разделены на разные разделы на основе метки времени (в имени) файла. Я могу обойти его в hive
, я надеюсь, что вы сделаете необходимый (если есть) для impala
, так как синтаксис запроса одинаковый.
Для меня эту проблему решить невозможно, используя только hive
. Поэтому я перепутал bash с сценариями улья, и он отлично работает для меня. Это, как я завернул:
- Создать таблицу
wikiPgvws
с разделом
- Создание таблицы
wikiTmp
с теми же полями, как wikiPgvws
за исключением разделов
Для каждого файла
я. Напитки данных в wikiTmp
ii.grep
времяStamp from fileName
iii. Используйте sed
для замены заполнителей в предопределенном файле сценария hql
для загрузки данных в фактическую таблицу. Затем запустите его.
падение стол wikiTmp
& удалить tmp.hql
Сценарий выглядит следующим образом:
#!/bin/bash
hive -e "CREATE EXTERNAL TABLE wikiPgvws(
project_code varchar(100),
page_name varchar(1000),
page_views int,
page_bytes int
)
PARTITIONED BY(dts STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
STORED AS TEXTFILE";
hive -e "CREATE TABLE wikiTmp(
project_code varchar(100),
page_name varchar(1000),
page_views int,
page_bytes int
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
STORED AS TEXTFILE"
for fileName in $(hadoop fs -ls /user/hdfs/bounty/pagecounts-*.txt | grep -Po '(?<=\s)(/user.*$)')
do
echo "currentFile :$fileName"
dst=$(echo $filename | grep -oE '[0-9]{8}-[0-9]{6}')
echo "currentStamp $dst"
sed "s!sourceFile!'$fileName'!" t.hql > tmp.hql
sed -i "s!targetPartition!$dst!" tmp.hql
hive -f tmp.hql
done
hive -e "DROP TABLE wikiTmp"
rm -f tmp.hql
hql
скрипт состоит всего из двух линий:
LOAD DATA INPATH sourceFile OVERWRITE INTO TABLE wikiTmp;
INSERT OVERWRITE TABLE wikiPgvws PARTITION (dts = 'targetPartition') SELECT w.* FROM wikiTmp w;
Эпилог:
Проверьте, соответствуют ли варианты, эквивалентные hive -e
& hive -f
доступны в impala
. Без них этот скрипт вам не нужен.Снова команды grep для получения файлаName & timeStamp необходимо изменить в соответствии с вашим расположением таблицы и штампом. Это всего лишь один способ показать, как эта работа может быть выполнена, но не может найти другую.
Enhencement
Если все работает хорошо, рассмотреть вопрос об объединении двух первых DDLS в другой сценарий, чтобы сделать его чище. Хотя, я не уверен, что аргументы сценария hql
могут использоваться для определения значений разделов, но вы можете взглянуть на замену sed
.