2013-06-10 4 views
1

Я создал таблицу в улье с помощью следующей команды:Выбор данных в Hadoop с Улей

CREATE TABLE tweet_table(
    tweet STRING 
) 
ROW FORMAT 
    DELIMITED 
     FIELDS TERMINATED BY '\n' 
     LINES TERMINATED BY '\n' 

вставить некоторые данные:

LOAD DATA LOCAL INPATH 'data.txt' INTO TABLE tweet_table 

data.txt:

data1 
data2 
data3data4 
data5 

Команда select * from tweet_table возвращается:

data1 
data2 
data3data4 
data5 

Но select tweet from tweet_table дает мне:

java.lang.RuntimeException: java.lang.ArrayIndexOutOfBoundsException: 0 
    at org.apache.hadoop.hive.ql.exec.Utilities.getMapRedWork(Utilities.java:230) 
    at org.apache.hadoop.hive.ql.io.HiveInputFormat.init(HiveInputFormat.java:255) 
    at org.apache.hadoop.hive.ql.io.HiveInputFormat.pushProjectionsAndFilters(HiveInputFormat.java:381) 
    at org.apache.hadoop.hive.ql.io.HiveInputFormat.pushProjectionsAndFilters(HiveInputFormat.java:374) 
    at org.apache.hadoop.hive.ql.io.CombineHiveInputFormat.getRecordReader(CombineHiveInputFormat.java:540) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:338) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:307) 
    at org.apache.hadoop.mapred.Child.main(Child.java:170) 
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0 
    at java.beans.XMLDecoder.readObject(XMLDecoder.java:250) 
    at org.apache.hadoop.hive.ql.exec.Utilities.deserializeMapRedWork(Utilities.java:542) 
    at org.apache.hadoop.hive.ql.exec.Utilities.getMapRedWork(Utilities.java:222) 
    ... 7 more 


FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.MapRedTask 
MapReduce Jobs Launched: 
Job 0: Map: 1 HDFS Read: 0 HDFS Write: 0 FAIL 
Total MapReduce CPU Time Spent: 0 msec 

Подобно этому, если данные были сохранены в правильной таблице, но не в tweet поле, почему?

+0

удалить все знакие категории: –

+0

Я создал таблицу: 'CREATE TABLE twidoop_db.tweet_table ( твит STRING ) \t ROW ФОРМАТ \t \t Разграниченный \t \t \t ЛИНИИ TERMINATED BY «\ n'' И я получил те же результаты, ту же ошибку. Когда я выполняю 'LOAD DATA ...', я получил строку: 'Таблица twidoop_db.tweet_table stats: [num_partitions: 0, num_files: 1, num_rows: 0, total_size: 31, raw_data_size: 0]' – Apaachee

+1

означает 0 строк загружается в таблицу после операции загрузки –

ответ

1

Тестирование против Apache Hive 1.2.1, похоже, что это поведение больше не воспроизводится точно так же. Однако весьма вероятно, что исходная проблема имела какое-то отношение к использованию одного и того же символа ('\n') как для терминатора поля, так и для терминатора линии в заявлении CREATE TABLE.

CREATE TABLE tweet_table(
    tweet STRING 
) 
ROW FORMAT 
    DELIMITED 
     FIELDS TERMINATED BY '\n' 
     LINES TERMINATED BY '\n' 

Это не может дать предсказуемые результаты, потому что вы сказали, что '\n' может указывать как конец поля или конец всей линии.

Это то, что происходит, когда я тестирую Apache Hive 1.2.1. Содержимое data.txt представляет собой 3 строки данных, каждая строка содержит 2 столбца, поля, разделенные вкладкой ('\t') и строки, разделенные '\n'.

key1 value1 
key2 value2 
key3 value3 

Давайте тест с полем терминатора и линией терминатора как установлено в '\n'.

hive> CREATE TABLE data_table(
    >  key STRING, 
    >  value STRING 
    >) 
    > ROW FORMAT 
    >  DELIMITED 
    >   FIELDS TERMINATED BY '\n' 
    >   LINES TERMINATED BY '\n'; 
OK 
Time taken: 2.322 seconds 
hive> LOAD DATA LOCAL INPATH 'data.txt' INTO TABLE data_table; 
Loading data to table default.data_table 
Table default.data_table stats: [numFiles=1, totalSize=36] 
OK 
Time taken: 2.273 seconds 
hive> SELECT * FROM data_table; 
OK 
key1 value1 NULL 
key2 value2 NULL 
key3 value3 NULL 
Time taken: 1.387 seconds, Fetched: 3 row(s) 
hive> SELECT key FROM data_table; 
OK 
key1 value1 
key2 value2 
key3 value3 
Time taken: 1.254 seconds, Fetched: 3 row(s) 
hive> SELECT value FROM data_table; 
OK 
NULL 
NULL 
NULL 
Time taken: 1.384 seconds, Fetched: 3 row(s) 

Мы можем видеть, что он интерпретируется каждый "key\tvalue" как key в определении таблицы, и предполагается, что не было ничего указано для value. Это допустимая интерпретация, поскольку в определении таблицы указано, что поля будут разделены на '\n', и на входе не будет '\n' до тех пор, пока не будут указаны как ключ, так и значение.

Теперь давайте повторим тот же тест с терминатором поля, установленным на '\t', и терминатор линии установлен на '\n'.

hive> CREATE TABLE data_table(
    >  key STRING, 
    >  value STRING 
    >) 
    > ROW FORMAT 
    >  DELIMITED 
    >   FIELDS TERMINATED BY '\t' 
    >   LINES TERMINATED BY '\n'; 
OK 
Time taken: 2.247 seconds 
hive> LOAD DATA LOCAL INPATH 'data.txt' INTO TABLE data_table; 
Loading data to table default.data_table 
Table default.data_table stats: [numFiles=1, totalSize=36] 
OK 
Time taken: 2.244 seconds 
hive> SELECT * FROM data_table; 
OK 
key1 value1 
key2 value2 
key3 value3 
Time taken: 1.308 seconds, Fetched: 3 row(s) 
hive> SELECT key FROM data_table; 
OK 
key1 
key2 
key3 
Time taken: 1.376 seconds, Fetched: 3 row(s) 
hive> SELECT value FROM data_table; 
OK 
value1 
value2 
value3 
Time taken: 1.281 seconds, Fetched: 3 row(s) 

На этот раз мы видим ожидаемые результаты.

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