2015-01-21 2 views
2

Я начал кластер EC2 на Amazon для установки cloudera ... Я установил его, настроил и загрузил некоторые из общедоступных снимков Wiki-представлений в HDFS. Структура файлов как таковые:добавить дату время от плоского файла имя cloudera

projectcode, pagename, pageviews, bytes 

файлы названы такие:

pagecounts-20090430-230000.gz 
      date time 

при загрузке данных из HDFS в Impala, я делаю это так:

CREATE EXTERNAL TABLE wikiPgvws 
(
    project_code varchar(100), 
    page_name varchar(1000), 
    page_views int, 
    page_bytes int 
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' 
LOCATION '/user/hdfs'; 

Одна вещь, которую я пропустил, это дата и время каждого файла. Директория:

/user/hdfs 

содержит несколько файлов pagecount, связанных с разными датами и временем. Как можно извлечь эту информацию и сохранить ее в столбце при загрузке в impala?

ответ

0

Я думаю, что вам не хватает концепции разделов. Если вы определяете таблицу как секционированную, данные могут быть разделены на разные разделы на основе метки времени (в имени) файла. Я могу обойти его в hive, я надеюсь, что вы сделаете необходимый (если есть) для impala, так как синтаксис запроса одинаковый.

Для меня эту проблему решить невозможно, используя только hive. Поэтому я перепутал bash с сценариями улья, и он отлично работает для меня. Это, как я завернул:

  1. Создать таблицу wikiPgvws с разделом
  2. Создание таблицы wikiTmp с теми же полями, как wikiPgvws за исключением разделов
  3. Для каждого файла
    я. Напитки данных в wikiTmp
    ii.grep времяStamp from fileName
    iii. Используйте sed для замены заполнителей в предопределенном файле сценария hql для загрузки данных в фактическую таблицу. Затем запустите его.

  4. падение стол 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.

Смежные вопросы