hive表格可以直接解析json文件、甚至是json文件的压缩包,用json文件解析表格直接建表会很方便,如图:
但是如果json的value中有多个逗号的话,那些不是以json格式作为源文件格式的表格去读取json表格的数据的时候会导致数据列错位,因为默认的text表格默认是以逗号作为分隔符的,会直接把json的value里的逗号当成分隔符来处理了。如图:
解决方法:
修改后续表格的文件格式:
默认的格式
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
新的格式:
ROW FORMAT SERDE
'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
'is.datastream.json'='false')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
新的表格的row格式为json
先看官网表述:
SerDe is a short name for “Serializer and Deserializer.”
Hive uses SerDe (and !FileFormat) to read and write table rows.
HDFS files –> InputFileFormat –> –> Deserializer –> Row object
Row object –> Serializer –> –> OutputFileFormat –> HDFS files
Note that the "key" part is ignored when reading, and is always a constant when writing. Basically row object is stored into the "value".
基本解释了hive从hdfs到结果展示和将hive内容写入hdfs的整个过程。
总结一下,当面临一个HDFS上的文件时,Hive将如下处理(以读为例):
(1) 调用InputFormat,将文件切成不同的文档。每篇文档即一行(Row)。
(2) 调用SerDe的Deserializer,将一行(Row),切分为各个字段。
当HIVE执行INSERT操作,将Row写入文件时,主要调用OutputFormat、SerDe的Seriliazer,顺序与读取相反。
行格式,SerDe是Serialize/Deserilize的简称,目的是用于序列化和反序列化。
序列化是对象转换为字节序列的过程。
序列化是字节序列恢复为对象的过程。
对象的序列化主要有两种用途:对象的持久化,即把对象转换成字节序列后保存到文件中;对象数据的网络传送。
除了上面两点, hive的序列化的作用还包括:Hive的反序列化是对key/value反序列化成hive table的每个列的值。Hive可以方便的将数据加载到表中而不需要对数据进行转换,这样在处理海量数据时可以节省大量的时间。
SerDe说明hive如何去处理一条记录,包括Serialize/Deserilize两个功能, Serialize把hive使用的java object转换成能写入hdfs的字节序列,或者其他系统能识别的流文件。Deserilize把字符串或者二进制流转换成hive能识别的java object对象。比如:select语句会用到Deserilize对象, 把hdfs数据解析出来;insert语句会使用Serialize,数据写入hdfs系统,需要把数据序列化。
行格式的话hive提供了有很多种默认的比如:
'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
解析json用的:
'org.openx.data.jsonserde.JsonSerDe'
等等
这个是序列化/反序列化涉及到的一些参数设置
读取hdfs文件的存储格式,默认使用的是TextInputFormat,一行表示一条记录。在每条记录(一行中),默认使用^A分割各个字段。在有些时候,我们往往面对多行,结构化的文档,并需要将其导入Hive处理,此时,就需要自定义InputFormat、OutputFormat,以及SerDe了。其他的格式还有SEQUENCEFILE、ORC等等。
默认的text格式可以直接在hadoop上查看内容,最简单方便但是占用空间最多、效率也最低。
存储文件的格式,默认是text,其他的格式还有SEQUENCEFILE、ORC等等。
inputformat和outputformat基本上就规定这个hive表格在读取和存储数据时的文件格式,然后row format serde规定了如何去解析和存储内容,具体这几项的内容可以去hive的官网学习参考。
转载和参考内容:
https://stackoverflow.com/questions/42416236/what-is-the-difference-between-inputformat-outputformat-stored-as-in-hive
https://www.coder4.com/archives/4031
https://www.cnblogs.com/Richardzhu/p/3613661.html
https://blog.csdn.net/longshenlmj/article/details/51702343
https://blog.csdn.net/mhtian2015/article/details/78873815
https://www.jianshu.com/p/9c43f03b97e7