Загрузка данных xml в таблицу кустов:org.apache.hadoop.hive.ql.metadata.HiveException
Я пытаюсь загрузить данные XML в Hive, но получаю сообщение об ошибке:
java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Ошибка времени выполнения куста при обработке строки {"xmldata":""}
XML-файл, который я использовал:
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<book>
<id>11</id>
<genre>Computer</genre>
<price>44</price>
</book>
<book>
<id>44</id>
<genre>Fantasy</genre>
<price>5</price>
</book>
</catalog>
Улей запрос, который я использовал:
1) Create TABLE xmltable(xmldata string) STORED AS TEXTFILE;
LOAD DATA lOCAL INPATH '/home/user/xmlfile.xml' OVERWRITE INTO TABLE xmltable;
2) CREATE VIEW xmlview (id,genre,price)
AS SELECT
xpath(xmldata, '/catalog[1]/book[1]/id'),
xpath(xmldata, '/catalog[1]/book[1]/genre'),
xpath(xmldata, '/catalog[1]/book[1]/price')
FROM xmltable;
3) CREATE TABLE xmlfinal AS SELECT * FROM xmlview;
4) SELECT * FROM xmlfinal WHERE id ='11
До 2-го запроса все в порядке, но когда я выполнил 3-й запрос, он выдает ошибку:
Ошибка, как показано ниже:
java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row {"xmldata":"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"}
at org.apache.hadoop.hive.ql.exec.ExecMapper.map(ExecMapper.java:159)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:417)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:332)
at org.apache.hadoop.mapred.Child$4.run(Child.java:268)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1438)
at org.apache.hadoop.mapred.Child.main(Child.java:262)
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row {"xmldata":"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"}
at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:675)
at org.apache.hadoop.hive.ql.exec
FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.MapRedTask
Так, где это идет не так? Также я использую правильный файл XML.
Спасибо, Шри
6 ответов
Найти Jar здесь - > Brickhouse,
Пример примера здесь - > Пример
аналогичный пример в stackru - здесь
Решение:
--Load xml data to table
DROP table xmltable;
Create TABLE xmltable(xmldata string) STORED AS TEXTFILE;
LOAD DATA lOCAL INPATH '/home/vijay/data-input.xml' OVERWRITE INTO TABLE xmltable;
-- check contents
SELECT * from xmltable;
-- create view
Drop view MyxmlView;
CREATE VIEW MyxmlView(id, genre, price) AS
SELECT
xpath(xmldata, 'catalog/book/id/text()'),
xpath(xmldata, 'catalog/book/genre/text()'),
xpath(xmldata, 'catalog/book/price/text()')
FROM xmltable;
-- check view
SELECT id, genre,price FROM MyxmlView;
ADD jar /home/vijay/brickhouse-0.7.0-SNAPSHOT.jar; --Add brickhouse jar
CREATE TEMPORARY FUNCTION array_index AS 'brickhouse.udf.collect.ArrayIndexUDF';
CREATE TEMPORARY FUNCTION numeric_range AS 'brickhouse.udf.collect.NumericRange';
SELECT
array_index( id, n ) as my_id,
array_index( genre, n ) as my_genre,
array_index( price, n ) as my_price
from MyxmlView
lateral view numeric_range( size( id )) MyxmlView as n;
Выход:
hive > SELECT
> array_index( id, n ) as my_id,
> array_index( genre, n ) as my_genre,
> array_index( price, n ) as my_price
> from MyxmlView
> lateral view numeric_range( size( id )) MyxmlView as n;
Automatically selecting local only mode for query
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Execution log at: /tmp/vijay/.log
Job running in-process (local Hadoop)
Hadoop job information for null: number of mappers: 0; number of reducers: 0
2014-07-09 05:36:45,220 null map = 0%, reduce = 0%
2014-07-09 05:36:48,226 null map = 100%, reduce = 0%
Ended Job = job_local_0001
Execution completed successfully
Mapred Local Task Succeeded . Convert the Join into MapJoin
OK
my_id my_genre my_price
11 Computer 44
44 Fantasy 5
Время: 8,541 секунд, извлечено: 2 строки
Добавление дополнительной информации в соответствии с запросом владельца вопроса:
Причина ошибки:
1) case-1: (ваш случай) - XML-контент подается в улей как строка за строкой.
входной XML:
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<book>
<id>11</id>
<genre>Computer</genre>
<price>44</price>
</book>
<book>
<id>44</id>
<genre>Fantasy</genre>
<price>5</price>
</book>
</catalog>
проверить в улье:
select count(*) from xmltable; // return 13 rows - means each line in individual row with col xmldata
Причина ошибки:
XML читается как 13 частей, а не как единое целое. такой неверный XML
2) case-2: XML-контент должен быть передан в куст как singleString - XpathUDFs работает со следующим синтаксисом: все функции имеют вид: xpath_ (xml_string, xpath_expression_string). * Source
Input.xml
<?xml version="1.0" encoding="UTF-8"?><catalog><book><id>11</id><genre>Computer</genre><price>44</price></book><book><id>44</id><genre>Fantasy</genre><price>5</price></book></catalog>
проверить в улье:
select count(*) from xmltable; // returns 1 row - XML is properly read as complete XML.
Средства:
xmldata = <?xml version="1.0" encoding="UTF-8"?><catalog><book> ...... </catalog>
тогда примените свой xpathUDF как это
select xpath(xmldata, 'xpath_expression_string' ) from xmltable
Затем выполните следующие шаги, чтобы получить решение так, как вы хотите, просто измените исходные данные
<catalog><book><id>11</id><genre>Computer</genre><price>44</price></book></catalog>
<catalog><book><id>44</id><genre>Fantasy</genre><price>5</price></book></catalog>
Теперь попробуйте следующие шаги:
select xpath(xmldata, '/catalog/book/id/text()')as id,
xpath(xmldata, '/catalog/book/genre/text()')as genre,
xpath(xmldata, '/catalog/book/price/text()')as price FROM xmltable;
теперь вы получите ответ как это:
["11"] ["Компьютер"] ["44"]
["44"] ["Фэнтези"] ["5"]
если вы примените xapth_string, xpath_int, xpath_int udfs, вы получите как:
11 компьютер 44
44 Фантазия 5.
Спасибо
Сначала попробуйте загрузить файл my add file path-to-file, который решит вашу проблему так, как она решена в моем случае
Также убедитесь, что файл XML не содержит пустых мест в конце последнего закрывающего тега. В моем случае исходный файл имел его, и всякий раз, когда я загружал файл в куст, моя результирующая таблица содержала NULLS в них. Поэтому всякий раз, когда я применяю функцию xpath, результатом будет несколько таких [] [] [] [] [] []
Хотя функция xpath_string работала, функции xpath_double и xpath_int никогда не работали. Это продолжало бросать это исключение -
Diagnostic Messages for this Task:
java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row {"line":""}
Oracle XML Extensions для Hive можно использовать для создания таблиц Hive поверх XML, как это. https://docs.oracle.com/cd/E54130_01/doc.26/e54142/oxh_hive.htm