Hive文件格式对比

Hive的文件存储格式包括:textfile, sequencefile, rcfile, orc, parquet

 

textfile

 

  默认的文件格式,行存储。建表时不指定存储格式即为textfile,导入数据时把数据文件拷贝至hdfs不进行处理。

 

优点:最简单的数据格式,便于和其他工具(Pig, grep, sed, awk)共享数据,便于查看和编辑;加载较快。

 

缺点:耗费存储空间,I/O性能较低;Hive不进行数据切分合并,不能进行并行操作,查询效率低。

 

适用于小型查询,查看具体数据内容的测试操作。

 

sequencefile

 

  含有键值对的二进制文件,行存储。

 

优点:可压缩、可分割,优化磁盘利用率和I/O;可并行操作数据,查询效率高;

 

缺点:存储空间消耗最大;对于Hadoop生态系统之外的工具不适用,需要通过text文件转化加载。

 

适用于数据量较小、大部分列的查询。

 

rcfile

  行列式存储。先将数据按行分块,同一个record在一个块上,避免读一条记录需要读多个block;然后块数据列式存储。

优点:可压缩,高效的列存取;查询效率较高。

缺点:加载时性能消耗较大,需要通过text文件转化加载;读取全量数据性能低

 

orc

  优化后的rcfile,行列式存储。

优缺点与rcfile类似,查询效率最高。

适用于Hive中大型的存储、查询。

 

parquet

  列存储。

优点:更高效的压缩和编码;不与任何数据处理技术绑定,可用于多种数据处理框架(Hive, Impala, Presto查询引擎;MapReduce, Spark计算框架;Avro, Thrift, PB数据模型 )。

缺点:不支持update, insert, delete, ACID

适用于字段数非常多,无更新,只取部分列的查询。

 

 

表的字段个数不多时,文件按块进行压缩,行存储对于处理重复数据时比较高效;

表的字段个数成百上千时,而只需查询其中的较少字段时,列存储可较大提高效率。

数据仓库一次写入,多次读写,orc格式的优势较明显。

 

转载于:https://www.cnblogs.com/milazhou/p/9329480.html

<think>好的,用户想知道在Hive中如何处理JSON格式的文件或数据。首先,我需要回忆一下Hive处理JSON的几种方法。记得主要有两种方式:使用JSONSerde和内置的JSON函数。 JSONSerde适合处理整个文件都是JSON的情况,每行一个JSON对象。比如用户提到如果整个文件是JSON,用Serde更方便。这时候建表时需要指定Serde,如org.apache.hive.hcatalog.data.JsonSerDe,然后定义好表结构,这样查询时可以直接访问字段。不过有时候数据可能有格式错误,这时候需要设置ignore.malformed.json属性来忽略错误行,避免查询失败。引用里的例子也提到了这个配置,所以应该提醒用户注意这一点。 另一种情况是当表中只有部分字段是JSON字符串,这时候可以用Hive的JSON函数,比如get_json_object或者json_tuple。get_json_object一次提取一个值,适合提取单个字段,但多次提取需要多次调用。而json_tuple可以一次提取多个字段,可能更高效。用户提到的引用里也说明了这点,特别是引用3中的内容,需要指出函数的不同使用场景。 另外,如果JSON中有复杂的结构,比如数组里面嵌套对象,建表时需要用到array<struct>这样的结构。例如引用4中提到,属性值对应[],里面是{}且字段固定,外层用array存储,里面用struct。这时候需要指导用户如何定义嵌套结构,确保Hive能正确解析。 还需要考虑用户可能遇到的问题,比如数据格式错误怎么处理,或者如何优化解析性能。比如设置SERDEPROPERTIES来忽略错误数据,或者使用LATERAL VIEW结合json_tuple来处理多个字段,提升效率。 最后,用户可能需要实际示例来理解如何操作,所以提供建表语句和查询示例会很有帮助。同时,注意事项部分应该总结不同方法的适用场景,帮助用户根据具体情况选择合适的方法。 总结下来,回答应该分点说明两种主要方法,给出配置示例和注意事项,并引用相关的参考资料。同时生成相关问题,帮助用户进一步了解优化和应用场景。</think>在Hive中处理JSON格式数据主要有以下两种方式,根据数据特征选择合适方法: ### 一、使用JSONSerde(推荐整行解析) **适用场景**:当文件中每行数据是完整的JSON对象时 ```sql CREATE EXTERNAL TABLE json_table ( id INT, name STRING, properties MAP<STRING,STRING> ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' LOCATION '/path/to/json/files'; -- 查询示例 SELECT name, properties['color'] FROM json_table; ``` **关键配置**: 1. 忽略格式错误数据:`ALTER TABLE json_table SET SERDEPROPERTIES ("ignore.malformed.json" = "true");` [^2] 2. 处理嵌套结构:数组用`array<struct<...>>`定义,例如: ```sql array<struct<type:string, url:string>> ```[^4] ### 二、使用JSON函数(部分字段解析) **适用场景**:表中某列存储JSON字符串时 1. `get_json_object`函数 ```sql -- 提取单个字段(返回STRING类型) SELECT get_json_object(json_col, '$.user.name') FROM table_with_json_column; ```[^3] 2. `json_tuple`函数(配合LATERAL VIEW使用) ```sql -- 同时提取多个字段(更高效) SELECT b.name, b.age FROM table_with_json_column a LATERAL VIEW json_tuple(a.json_col, 'name', 'age') b AS name, age; ``` ### 三、注意事项 1. **性能对比**:JSONSerde在加载时解析,JSON函数在查询时解析 2. **数据类型**:JSONSerde自动转换类型,JSON函数返回STRING需显式转换 3. **复杂结构**:嵌套数组使用`array<struct<...>>`定义字段结构[^4] ### 四、处理示例 混合格式数据(含错误数据)处理: ```sql CREATE TABLE error_tolerant_table ( log STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH SERDEPROPERTIES ("ignore.malformed.json" = "true"); ```[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值