hive表格字段错位解决办法(源文件为json)

hive表格可以直接解析json文件、甚至是json文件的压缩包,用json文件解析表格直接建表会很方便,如图:
hive表格字段错位解决办法(源文件为json)_第1张图片

但是如果json的value中有多个逗号的话,那些不是以json格式作为源文件格式的表格去读取json表格的数据的时候会导致数据列错位,因为默认的text表格默认是以逗号作为分隔符的,会直接把json的value里的逗号当成分隔符来处理了。如图:

hive表格字段错位解决办法(源文件为json)_第2张图片

解决方法:

修改后续表格的文件格式:

默认的格式

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,顺序与读取相反。

ROW FORMAT SERDE

行格式,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' 

等等

WITH SERDEPROPERTIES

这个是序列化/反序列化涉及到的一些参数设置

STORED AS INPUTFORMAT

读取hdfs文件的存储格式,默认使用的是TextInputFormat,一行表示一条记录。在每条记录(一行中),默认使用^A分割各个字段。在有些时候,我们往往面对多行,结构化的文档,并需要将其导入Hive处理,此时,就需要自定义InputFormat、OutputFormat,以及SerDe了。其他的格式还有SEQUENCEFILE、ORC等等。

默认的text格式可以直接在hadoop上查看内容,最简单方便但是占用空间最多、效率也最低。

OUTPUTFORMAT 

存储文件的格式,默认是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

 

你可能感兴趣的:(hive表格字段错位解决办法(源文件为json))