在 Cloudera 中使用 serde 加载 JSON 文件

Posted

技术标签:

【中文标题】在 Cloudera 中使用 serde 加载 JSON 文件【英文标题】:Loading JSON file with serde in Cloudera 【发布时间】:2014-08-05 23:01:56 【问题描述】:

我正在尝试使用具有此包结构的 JSON 文件:


   "user_id": "kim95",
   "type": "Book",
   "title": "Modern Database Systems: The Object Model, Interoperability, and Beyond.",
   "year": "1995",
   "publisher": "ACM Press and Addison-Wesley",
   "authors": [
      
         "name": "null"
      
   ],
   "source": "DBLP"


   "user_id": "marshallo79",
   "type": "Book",
   "title": "Inequalities: Theory of Majorization and Its Application.",
   "year": "1979",
   "publisher": "Academic Press",
   "authors": [
      
         "name": "Albert W. Marshall" 
      ,
      
         "name": "Ingram Olkin"
      
   ],
   "source": "DBLP"

我尝试使用 serde 为 Hive 加载 JSON 数据。我遵循了我在这里看到的两种方式:http://blog.cloudera.com/blog/2012/12/how-to-use-a-serde-in-apache-hive/

使用此代码:

CREATE EXTERNAL TABLE IF NOT EXISTS serd (
           user_id:string, 
           type:string, 
           title:string,
           year:string,
           publisher:string,
           authors:array<struct<name:string>>,
           source:string)       
    ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
    LOCATION '/user/hdfs/data/book-seded_workings-reduced.json';

我收到了这个错误:

error while compiling statement: failed: parseexception line 2:17 cannot recognize input near ':' 'string' ',' in column type

我也试过这个版本:https://github.com/rcongiu/Hive-JSON-Serde

这给出了一个不同的错误:

Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Cannot validate serde: org.openx.data.jsonserde.JsonSerde

有什么想法吗?

我还想知道有哪些替代方法可以使用这样的 JSON 来查询“作者”中的“姓名”字段。是猪还是蜂巢?

我已经将其转换为“tsv”文件。但是,由于我的作者列是一个元组,如果我从这个文件构建一个表,我不知道如何使用 Hive 对“名称”提出请求。我应该更改我的脚本以进行“tsv”转换还是保留它?或者有没有 Hive 或 Pig 的替代品?

【问题讨论】:

忘了说我在 cdh5 quickstart 中使用了这个脚本进行 tsv 转换:***.com/questions/24976373/… 位置'/user/hdfs/data/book-seded_workings-reduced.json';它应该是目录而不是文件。 “book-seded_workings-reduced.json”在我看来是文件。 【参考方案1】:

Hive 没有内置对 JSON 的支持。因此,为了在 Hive 中使用 JSON,我们需要使用第三方 jar,例如: https://github.com/rcongiu/Hive-JSON-Serde

您对 create table 语句有几个问题。它应该是这样的:

CREATE EXTERNAL TABLE IF NOT EXISTS serd ( 
user_id string,type string,title string,year string,publisher string,authors array<string>,source:string)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION...

您使用的 JSON 记录将每条记录保存在一行中,如下所示:

"user_id": "kim95", "type": "Book", "title": "Modern Database Systems: The Object Model, Interoperability, and Beyond.", "year": "1995", "publisher": "ACM Press and Addison-Wesley", "authors": ["name":"null"], "source": "DBLP" 
"user_id": "marshallo79", "type": "Book", "title": "Inequalities: Theory of Majorization and Its Application.", "year": "1979", "publisher": "Academic Press","authors": ["name":"Albert W. Marshall","name":"Ingram Olkin"], "source": "DBLP"

从 GIT 下载项目后,您需要编译将创建一个 jar 的项目,您需要在运行 create table 语句之前将该 jar 添加到 Hive 会话中。

希望对你有帮助...!!!

【讨论】:

这正是我所做的......我说我尝试了两种解决方案......除了我添加了结构的数组......我现在没有我的笔记本电脑在我的眼前。 ..我会告诉它是否工作以后 对于我问题的第二部分,有没有办法只用猪来做到这一点???或者一旦我在 tsv 中转换了我的 json ......我可以创建一个表,然后使用 hive 进行诸如“Select Into”之类的查询??? 好吧,我没有和 Pig 合作过,所以不能给你任何建议。但这应该有效。我看到一条错误消息:无法验证 serde: org.openx.data.jsonserde.JsonSerde 这意味着 Hive 没有获取 jar。你能检查一下吗,你可能错误地添加了错误的jar。 我使用了这个脚本 CREATE EXTERNAL TABLE serd( user_id STRING, type STRING, title STRING, year STRING, publisher STRING, authors STRUCT, source STRING) ROW FORMAT SERDE 'org.openx .data.jsonserde.JsonSerDe'; LOAD DATA LOCAL INPATH '/user/hdfs/data/book-seded-workings-reduced.json/' INTO TABLE serd;我添加了 jar json-serde-1.1.4-jar-with-dependencies.jar,我得到了这个错误:org.apache.hadoop.hive.ql.exec.DDLTask。无法初始化类 org.openx.data.jsonserde.objectinspector.JsonObjectInspectorFactory【参考方案2】:

add jar 仅添加到不可用的会话中,最后出现错误。 将 JAR 加载到 Hive 和 Map Reduce 路径的所有节点上,如下所示,以便 HIVE 和 Map Reduce 组件在调用时选择它。

    /hadoop/CDH_5.2.0_Linux_parcel/parcels/CDH-5.2.0- 1.cdh5.2.0.p0.36/lib/hive/lib/json-serde-1.3.6-jar-with-依赖项.jar

    /hadoop/CDH_5.2.0_Linux_parcel/parcels/CDH-5.2.0-1.cdh5.2.0.p0.36/lib/hadoop-mapreduce/lib/json-serde-1.3.6-jar- with-dependencies.jar

注意:此路径因集群而异。

【讨论】:

以上是关于在 Cloudera 中使用 serde 加载 JSON 文件的主要内容,如果未能解决你的问题,请参考以下文章

用于 ORC 或 RC 格式的 Hive Json SerDE

在 SparkSQL Thrift Server 上添加 Hive SerDe jar

HIVE Row Formats和SerDe

Hive系列之SerDe

Presto - 在列表中使用 serde?

hive表加载csv格式数据或者json格式数据