Можно ли использовать HCatalog с XML? Выполнение ETL на Cloudera VM

Я работаю над проектом для класса больших данных и установил виртуальную машину Cloudera Quickstart локально, чтобы выполнять некоторые основные задачи в моем наборе данных и знакомиться с некоторыми инструментами. Я следовал руководству, которое включало перемещение набора данных в HDFS, создание таблицы HCatalog на основе файла набора данных, а затем выполнение команд Hive и/или Pig для таблицы. Проблема в том, что мои данные представляют собой большой файл XML, и стандартные параметры разделителя в HCatalog не применяются.

Есть ли способ импортировать XML в HCatalog? Если нет, то как лучше всего использовать Hive или Pig в моем наборе данных XML?

РЕДАКТИРОВАТЬ: мой файл из общедоступного набора данных StackOverflow. Я использую файл posts.xml. Он довольно большой (25 ГБ), и у меня возникли проблемы с его открытием на моей машине, но ниже приведена структура в соответствии с файлом Readme:

- **posts**.xml
   - Id
   - PostTypeId
      - 1: Question
      - 2: Answer
   - ParentID (only present if PostTypeId is 2)
   - AcceptedAnswerId (only present if PostTypeId is 1)
   - CreationDate
   - Score
   - ViewCount
   - Body
   - OwnerUserId
   - LastEditorUserId
   - LastEditorDisplayName="Jeff Atwood"
   - LastEditDate="2009-03-05T22:28:34.823"
   - LastActivityDate="2009-03-11T12:51:01.480"
   - CommunityOwnedDate="2009-03-11T12:51:01.480"
   - ClosedDate="2009-03-11T12:51:01.480"
   - Title=
   - Tags=
   - AnswerCount
   - CommentCount
   - FavoriteCount

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


person Amru E.    schedule 16.03.2014    source источник
comment
Что касается размера данных на виртуальной машине: это зависит от размера вашей виртуальной машины и типа вашего хранилища. У меня есть эта виртуальная машина с 8 ядрами и 24 ГБ ОЗУ дома, с SSD для хранения. Даже с этим я, вероятно, запустил бы только подмножество данных (возможно, 1-3%). Вы пытаетесь учиться, а не тестировать производительность. Если для запуска тестового задания требуется 2 часа, прежде чем вы увидите результат, это замедлит процесс обучения.   -  person JamCon    schedule 17.03.2014
comment
@JamCon для нашего проекта требуется большой набор данных, подобный этому, но сейчас я изучаю, как использовать инструменты, а затем выполняю настоящий ETL для реального набора данных в AWS. Думаю, я попытаюсь использовать меньший набор данных для тестирования/обучения.   -  person Amru E.    schedule 18.03.2014


Ответы (1)


XML использует довольно стандартизированную структуру, поэтому мне было бы интересно увидеть ваш формат данных и узнать, какой разделитель не работает.

Не зная больше о данных/структуре и т. д., я бы, вероятно, сделал следующее:

  1. Выберите мою схему и создайте HCatalog вручную (или по сценарию, в зависимости от того, что проще).
  2. Загрузите данные через pig, используя piggybank XMLLoader.
  3. Разобрать данные с помощью регулярных выражений в схему, которую я выбрал для HCat.
  4. Сохраните его с помощью метода HCatStore.



--Пример кода

REGISTER piggybank.jar

items = LOAD 'rss.txt' USING org.apache.pig.piggybank.storage.XMLLoader('item') AS  (item:chararray);

data = FOREACH items GENERATE 
REGEX_EXTRACT(item, '<link>(.*)</link>', 1) AS  link:chararray, 
REGEX_EXTRACT(item, '<title>(.*)</title>', 1) AS  title:chararray,
REGEX_EXTRACT(item, '<description>(.*)</description>',  1) AS description:chararray,
REGEX_EXTRACT(item, '<pubDate>.*(\\d{2}\\s[a-zA-Z]{3}\\s\\d{4}\\s\\d{2}:\\d{2}:\\d{2}).*</pubDate>', 1) AS  pubdate:chararray;

STORE data into 'rss_items' USING org.apache.hcatalog.pig.HCatStorer();


validate = LOAD 'default.rss_items' USING org.apache.hcatalog.pig.HCatLoader();
dump validate;



-- Результаты

(http://www.hannonhill.com/news/item1.html,News Item 1,Description of news item 1 here.,03 Jun 2003 09:39:21)
(http://www.hannonhill.com/news/item2.html,News Item 2,Description of news item 2 here.,30 May 2003 11:06:42)
(http://www.hannonhill.com/news/item3.html,News Item 3,Description of news item 3 here.,20 May 2003 08:56:02)



-- файл данных rss.txt

<rss version="2.0">
   <channel>
      <title>News</title>
      <link>http://www.hannonhill.com</link>
      <description>Hannon Hill News</description>
      <language>en-us</language>
      <pubDate>Tue, 10 Jun 2003 04:00:00 GMT</pubDate>
      <generator>Cascade Server</generator>
      <webMaster>[email protected]</webMaster>
      <item>
         <title>News Item 1</title>
         <link>http://www.hannonhill.com/news/item1.html</link>
         <description>Description of news item 1 here.</description>
         <pubDate>Tue, 03 Jun 2003 09:39:21 GMT</pubDate>
         <guid>http://www.hannonhill.com/news/item1.html</guid>
      </item>
      <item>
         <title>News Item 2</title>
         <link>http://www.hannonhill.com/news/item2.html</link>
         <description>Description of news item 2 here.</description>
         <pubDate>Fri, 30 May 2003 11:06:42 GMT</pubDate>
         <guid>http://www.hannonhill.com/news/item2.html</guid>
      </item>
      <item>
         <title>News Item 3</title>
         <link>http://www.hannonhill.com/news/item3.html</link>
         <description>Description of news item 3 here.</description>
         <pubDate>Tue, 20 May 2003 08:56:02 GMT</pubDate>
         <guid>http://www.hannonhill.com/news/item3.html</guid>
      </item>
   </channel>
</rss>
person JamCon    schedule 16.03.2014
comment
Спасибо за подробный ответ! Мой файл XML имеет структуру, аналогичную вашему файлу rss.txt (я обновил ОП). Я использовал HCatalog в интерфейсе Hue, и мне была предоставлена ​​возможность разграничить мои данные пробелом, табуляцией, запятой или произвольным образом. Кажется, ни один из вариантов не применяется (хотя я не знаю, как использовать пользовательский, это может быть тот). И я предполагаю, что Pig может получить доступ к моему файлу в HDFS, верно? Я никогда не использовал Pig, но, похоже, я должен хорошо с ним познакомиться. - person Amru E.; 17.03.2014
comment
Ах, в этом есть смысл... да, HCat на самом деле не работает со сложным форматированным материалом, таким как XML. Вы можете использовать закрывающий тег ‹/ в качестве разделителя, но тогда у вас останется мусор в начале ваших записей (например, описание›). Вы должны разобрать его с помощью Pig или Hive, а затем загрузить в каталог. В этом случае я предпочитаю Pig Hive, потому что Pig не требует построения схем или таблиц для этапа синтаксического анализа. Пример файла rss.txt, который я использовал выше, действительно находился в HDFS... Pig обычно является предпочтительным языком для шагов ETL, поэтому его очень полезно изучить. - person JamCon; 17.03.2014
comment
еще одна вещь, если вы не возражаете. Мои данные на самом деле в формате: <row Id="" Author="" /> без открывающих и закрывающих тегов, но каждый тег закрывается сам, и все элементы находятся в одном теге. Как я мог справиться с этим в Pig? - person Amru E.; 21.03.2014
comment
Вы можете сделать это несколькими способами... один из самых простых - просто изменить регулярное выражение, чтобы вы проходили через элемент строки пару раз, ища каждый из атрибутов. Что-то вроде: REGEX_EXTRACT(item, '<row.*Id="(.*)".*>', 1) AS id:chararray, и REGEX_EXTRACT(item, '<row.*Author="(.*)".*>', 1) AS author:chararray, - person JamCon; 21.03.2014
comment
Вы оказали огромную помощь до сих пор! Как вы думаете, вы можете ответить на мой дополнительный вопрос: заголовок stackoverflow.com/questions/22627693/? Спасибо! - person Amru E.; 25.03.2014