gpt4 book ai didi

hadoop - 使用 Hive 选择数据到 Hadoop

转载 作者:可可西里 更新时间:2023-11-01 15:40:12 24 4
gpt4 key购买 nike

我使用以下命令在 Hive 中创建了一个表:

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 字段中,为什么?

最佳答案

针对 Apache Hive 1.2.1 进行测试,似乎此行为不再以完全相同的方式重现。但是,原始问题很可能与在 CREATE TABLE< 中使用相同的字符 ('\n') 作为字段终止符和行终止符有关声明。

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)

这次我们看到了预期的结果。

关于hadoop - 使用 Hive 选择数据到 Hadoop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17019443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com