Hive 错误 - 从表中选择 *;

Posted

技术标签:

【中文标题】Hive 错误 - 从表中选择 *;【英文标题】:Hive error - Select * from table ; 【发布时间】:2016-06-14 17:27:01 【问题描述】:

我在 hive 中创建了一个外部表,已成功创建。

create external table load_tweets(id BIGINT,text STRING)
     ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
     LOCATION '/user/cloudera/data/tweets_raw';

但是,当我这样做时:

hive> select * from load_tweets;

我收到以下错误:

失败并出现异常 java.io.IOException:org.apache.hadoop.hive.serde2.SerDeException: org.codehaus.jackson.JsonParseException: 意外字符('O'(代码 79)):预期有效值(数字, 字符串, 数组, 对象, 'true', 'false' 或 'null') 在 [来源:java.io.ByteArrayInputStream@5dfb0646;行:1,列:2]**

请建议我如何解决这个问题。是使用flume创建的twitter o/p文件损坏还是其他什么?

【问题讨论】:

请同时提供数据示例。 您没有有效的 JSON 数据 【参考方案1】:

您需要做两件事。

1) 将数据放入文件中(可能使用 INSERT)。或者它已经在那里了。无论哪种情况,您都需要

2) 来自 Hive,msck repair table load_tweets;

对于 Hive 表,有关数据的架构和其他元信息存储在所谓的 Hive Metastore 中——它实际上是一个关系数据库。当您对未使用 LOCATION 关键字创建的 Hive 表(即内部而不是外部表)执行操作时,Hive 将自动更新元存储。

但大多数 Hive 用例会导致将数据附加到使用其他进程更新的文件中,因此外部表很常见。如果新分区是在外部创建的,在您可以使用 Hive 查询它们之前,您需要使用 msck repair table <tablename>; 强制元存储与数据的当前状态同步。

【讨论】:

- 请编辑您的答案,msck repair 仅用于在 Metastore 中为表添加新分区。不适用于非分区表中的数据 谢谢;我已经澄清了。文档似乎对此很清楚,但我的经验是 Hive 似乎甚至无法识别外部添加的新数据(例如水槽、hdsf -put 等)。感谢您的提醒。 np :) ,如果没有自动反映在 hive 表上,您还可以使用 analyze table 进行任何元数据更新。

以上是关于Hive 错误 - 从表中选择 *;的主要内容,如果未能解决你的问题,请参考以下文章

无法找到创建的 Hive 表,也无法从表中检索数据

从表中选择 2 个最大的 NIP

从表中随机选择一定百分比的条目

尝试从表中运行 select count(*) 查询时在配置单元中出错

从表中选择*与从表中选择col1,col2,col3 [重复]

Hive06-HiveQL:查询