我使用以下命令在配置单元中创建了一个表:
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
菲尔德,为什么?
1条答案
按热度按时间djp7away1#
在针对ApacheHive1.2.1的测试中,这种行为似乎不再以完全相同的方式进行复制。然而,最初的问题很可能与使用相同的字符有关(
'\n'
)作为CREATE TABLE
声明。这不能产生可预测的结果,因为你说过
'\n'
既可以表示字段的结尾,也可以表示整行的结尾。这就是我对ApacheHive1.2.1进行测试时发生的情况。data.txt的内容是3行数据,每行包含2列,字段之间用制表符隔开(
'\t'
)线之间用'\n'
.让我们用字段终止符和行终止符都设置为
'\n'
.我们可以看到它解释了每一个
"key\tvalue"
作为key
在表定义中,并假定没有为value
. 这是一个有效的解释,因为表定义声明字段将由'\n'
,并且没有'\n'
在输入键和值之后。现在,让我们在字段终止符设置为的情况下重复相同的测试
'\t'
线路终端设置为'\n'
.这一次我们看到了预期的结果。