先说简单的使用

CREATE TABLE `cc_test_serde`(

`id` string COMMENT 'from deserializer',

`name` string COMMENT 'from deserializer')

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.JsonSerDe'
STORED AS INPUTFORMAT    'org.apache.hadoop.mapred.TextInputFormat'     
 OUTPUTFORMAT    'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';

hdfs dfs -put student.json /tmp/spark/job

load data inpath "/tmp/spark/job/student.json" overwrite into table cc_test_serde

select * from cc_test_serde

注意点。

1.cdh6.3.2 hive2 版本只用 ROW FORMAT SERDE 即可。

但是cdp需要 ROW FORMAT SERDE /STORED AS INPUTFORMAT/OUTPUTFORMAT

2.这个表的注释貌似是没有用的。

3.我采用的beeline连接不能使用local inpath 需要上传导hdfs

————————————————————————————————————————

csv同理如上。但是csv是要更复杂些的。

以csv数据来说 一般会有表头,而且csv会有quote,也会有escape

所以会稍微复杂些。稍后一一举例来说

CREATE TABLE `cc_test_csv`(

`id` string COMMENT 'from deserializer',

`name` string COMMENT 'from deserializer')

ROW FORMAT SERDE

'org.apache.hadoop.hive.serde2.OpenCSVSerde'
STORED AS INPUTFORMAT    'org.apache.hadoop.mapred.TextInputFormat'     
 OUTPUTFORMAT    'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
;

hdfs dfs -put -f student.json /tmp/spark/job
load data inpath "/tmp/spark/job/student.json" overwrite into table cc_test_csv

查询结果

差不多load进去了,但是又多了表头,所以我们要去掉表头。

lowb方法 insert overwrite table  cc_test_csv select * from  cc_test_csv where id!='id'

高级方式 tblproperties("skip.header.line.count"="1")

CREATE TABLE `cc_test_csv`(

`id` string COMMENT 'id',

`name` string COMMENT 'name')

ROW FORMAT SERDE

'org.apache.hadoop.hive.serde2.OpenCSVSerde'
STORED AS INPUTFORMAT    'org.apache.hadoop.mapred.TextInputFormat'     
 OUTPUTFORMAT    'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
 tblproperties("skip.header.line.count"="1")

或者

alter table cc_test_csv set tblproperties("skip.header.line.count"="1");

解决了表头问题。

——————————————————————————————————————————

csv问题2,有的csv文件有的数据是有""括起来的

[devuser@cdp-node12 ~/chenchi]$ cat student.json 
"id","name"
"1","2"
3,4
5,
,6
"7",
"","8"

load之后好像还是可以的,说明openCSV这个类读的还是挺准的。

那么问题来了。

这里我希望 有的就是字符串"" 有的是null opencsv能不能读出来呢?

比如5, 第二个字段应该是空。 "","8"这里第一个字段是"" 。

在搞清楚这些之前我们需要了解csv的一些基本属性

public static final String SEPARATORCHAR = "separatorChar";
public static final String QUOTECHAR = "quoteChar";
public static final String ESCAPECHAR = "escapeChar";public static final char DEFAULT_ESCAPE_CHARACTER = '"';
public static final char DEFAULT_SEPARATOR = ',';
public static final char DEFAULT_QUOTE_CHARACTER = '"';

分别是 分隔符 括起符 逃逸字符。

这三个是什么意思?默认值又是什么?

括起符默认"   分割符默认是, 关键是这个逃逸字符也是"

括起符顾名思义,csv每一行由多列构成,每一列用""括起来 例如 "a","b"

分隔符就是"a","b"

重点来了 逃逸字符是什么?我也不知道 百度也百不出,但是总归有办法的。

hive 源码 TestOpenCSVSerde

其实逃逸字符本身的目的我认为就是有些字符串千奇百怪,但是我还要保留例如," ' 。

例如 一段字符串只有三列

a,b,c

a,b,c,,,,,d  --这个的第三列字符串就是 c,,,,,d

"a","b","c"d"",第三列就是c"d"

如上所示有的字符串就是这样 你有什么办法呢?

两种办法

1.换种思路,csv不是说分割符一定就是,也可以是其他符号比如@,那么a@b@c,,,,,d ,这种对于csvreader来说不就是小菜一碟

有的人又说了@万一我字符串里也有呢?那么能不能@$@#当作分割符。

2. 这个就是逃逸字符的用处了。就是逃逸字符的下一个字符逃跑了。举例来说

下载hive源码 org.apache.hadoop.hive.serde2.OpenCSVSerde

au.com.bytecode.opencsv.CSVParser

for(int i = 0; i < nextLine.length(); ++i) {char c = nextLine.charAt(i); //把每列的字符串拆分为字符if (c == this.escape) { //是否等于逃逸字符if (this.isNextCharacterEscapable(nextLine, inQuotes || this.inField, i)) {//isNextCharacterEscapable这方法是看 是否括起来了&&(下个字符是quote或者是escape)//如果是就把下一个字符放到sb里去sb.append(nextLine.charAt(i + 1));++i;} 这里没有else 说明啥也不干。} else if (c != this.quotechar) { //如果不= quoteif (c == this.separator && !inQuotes) { // 如果=分割符并且没有被quotetokensOnThisLine.add(sb.toString());sb.setLength(0);this.inField = false;} else if (!this.strictQuotes || inQuotes) {sb.append(c);this.inField = true;}} else { //这个else 说明当前字符就是quoteif (this.isNextCharacterEscapedQuote(nextLine, inQuotes || this.inField, i)) {//是否括起来 是否在区域内,下个字符=escape sb.append(nextLine.charAt(i + 1));++i;} else {//!this.strictQuotes=true,//然后看当前字符的上一个字符是否=分隔符//然后看当前字符的下一个字符是否=分隔符if (!this.strictQuotes && i > 2 && nextLine.charAt(i - 1) != this.separator && nextLine.length() > i + 1 && nextLine.charAt(i + 1) != this.separator) {//就是看字符是不是空白 空白就啥也不干if (this.ignoreLeadingWhiteSpace && sb.length() > 0 && this.isAllWhiteSpace(sb)) {sb.setLength(0);} else {sb.append(c);}}//当前字符就是quote 处理完当前字符后 就要处理分割符了inQuotes = !inQuotes;}//是否是在字段内? 这里和上面quote一般来说是一致的 什么情况不一致呢?this.inField = !this.inField;}
}

本来想总结下的。想了下有点麻烦。直接上案例

props.setProperty(OpenCSVSerde.QUOTECHAR, "\"");
props.setProperty(OpenCSVSerde.SEPARATORCHAR, ",");
props.setProperty(OpenCSVSerde.ESCAPECHAR, "\\");
csv.initialize(null, props);
final Text in = new Text("\"a\",\"\",\"\\\"c\\\"c\"");
final Text in2 = new Text("a,,\\\"c\\\"c");
final Text in3 = new Text("a,,a\\\"c\\\"");
final Text in4 = new Text("\"a\",\"\",\"\\\"c\\\"\\,\\\"c\"");

"a","","\"c\"c"
i=0,value=a
i=1,value=
i=2,value="c"c

a,,\"c\"c
i=0,value=a
i=1,value=
i=2,value=null

a,,a\"c\"
i=0,value=a
i=1,value=
i=2,value=a"c"

"a","","\"c\"\,\"c"
i=0,value=a
i=1,value=
i=2,value="c","c

逻辑有点麻烦 我也理的不是特别清楚。

1.能用quote就用quote

2.注意第二个案例如果没有quote。 逃逸字符后面跟着quote如果刚好出现在该字段最前面会出现问题

3.value="" 我也想变成null 但是不行。因为他最开始就是

StringBuilder sb = new StringBuilder(128);

然后 sb.toString=""

为什么第二个案例有个null呢?

因为第二个案例只被csvreader读取了两段。第三段直接被赋值为null了。

____________________________________________________________________________

为什么要研究这么多呢?

除了csv json 我们还有没有其他格式的呢? 比如更复杂的json 比如xml(当然这个不太可能)

比如正则,比如其他格式数据甚至说是加密数据

sadfsda1234,12314daafdfa,sqeqd31n12 实际上是 a,b,c

那这种数据我们怎么解析呢? 很简单。。。自定义一种serde......然后放到hive目录下就可以建表的时候自定义serde了。

虽然我没尝试。但是这种方式我觉得也很正常。。不说了又多了一种吹b的方式。

hive表加载csv格式数据或者json格式数据相关推荐

  1. CC00053.pbpositions——|HadoopPB级数仓.V11|——PB数仓.v11|核心交易分析|DIM层建表|加载数据|

    一.DIM层建表加载数据:DIM层建表加载数据概述 ### --- 首先要确定哪些是事实表.哪些是维表.绿色的是事实表,灰色的维表~~~ 用什么方式处理维表,每日快照.拉链表? ~~~ 小表使用每日快 ...

  2. Oracle 外部表加载监听日志,使用外部表访问监听日志

    某天工作是使用外部表加载监听日志信息,观察并分析用户连接数变化趋势 按照eygle循序渐进oracle的教程一步步进行: 测试使用外部表先创建目录: connect  / as sysdba crea ...

  3. Bigemap加载CAD(dxf)、SHP、KML数据加载并套合到卫星图像上

    Bigemap加载CAD(dxf).SHP.KML数据加载并套合到卫星图像上 同步视频教程:如何编辑已有的测绘数据(excel转KML,txt转KML)-Bigemap GIS Office 视频教程 ...

  4. R-数据加载(csv,excel,txt,rdata,spss,stata)

    原始数据可以从本地文件,本地数据库和网络上获取.本地文件主要包括:txt文件,csv文件,excel文件,RData文件,xml文件.本地数据库类型包括SQL Server,Access,MySQL, ...

  5. Python加载csv文件的两种方式

    本文主要讲解下Python加载csv文件的两种方式,如果知道如何处理的就不必往下看了! 下面来简单介绍下. 实例中的数据集是kaggle的Digit Recognizer的train.csv文件,数据 ...

  6. python使用openCV加载图像、并将BGR格式转换成HSV格式、定义HSV格式中需要分离颜色的掩码(掩模)区间(mask)、并使用mask信息进行颜色分离、BGR格式的图像转化为RGB、并可视化

    python使用openCV加载图像.并将BGR格式转换成HSV格式.定义HSV格式中需要分离颜色的掩码(掩模)区间(mask).并使用mask信息进行颜色分离.将BGR格式的图像转化为RGB.可视化 ...

  7. php table转json,html table表数据转Json格式示例代码分析

    本文为大家介绍下html table表数据转Json格式,下面有个不错的示例,大家可以参考下 代码如下: var keysArr = new Array("key0", " ...

  8. Druid加载(load data)HDFS文件数据

    Druid加载csv类型文件 [root@zeusmaster bin]# more 2.csv  TIME,STR,NUM 2021-01-21 10:54:46,a,1 2021-01-21 10 ...

  9. pandas加载csv出错:UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xca in position 0: invalid contin

    pandas采用read_csv加载csv文件时出现了编码错误,错误信息如下: 解决方法为,在代码首部加上coding:uft-8的说明,读入csv文件时,采用gbk的编码方式: 全部代码如下: #- ...

最新文章

  1. 百分点内存数据库架构演变
  2. jmeter(十八)关联之XPath Extractor
  3. jetson nano 安装 onnx
  4. GraphQL:验证与授权
  5. Google开发者模式调试css样式的方法
  6. 多表关联查询_【函数007】 EXCEL多表关联查询实战
  7. 容器编排技术 -- Kubernetes从零开始搭建自定义集群
  8. oracle 12c transaction guard,oracle 12c的Data guard中废弃
  9. Dockerfile创建pytorch1.1.0+cuda10.0+cudnn7.5踩过的坑
  10. Simulink Memory vs Unit Delay
  11. UGUI的表格布局组件
  12. 三维地图数据资源汇总
  13. gmail 邮件客户端设置
  14. 修改cnn梯度下降——MEO方法应用
  15. 关于opengl中glColor3f的应用
  16. Linux用户管理安全宝典:密码防破解与帐号文件保护
  17. Qt实现QQ截图中的马赛克效果
  18. idea从插件市场或者外部插件库导入插件的方式
  19. 花了一个周末折腾蜗牛星际的黑群晖,多图预警!
  20. C语言实现 百钱百鸡

热门文章

  1. 2019最新升级【超能版】 vbox硬件级虚拟机系统 去虚拟化去vm标识 支持批量启动 批量克隆 CPA网赚挂机电商 virtualbox
  2. 奶茶店一天盈利有多少?广州哪里有专业奶茶培训点
  3. Android 密码丢了,丢失密钥库密码
  4. 哪个dns服务器延迟最低,可以立即测出延迟最小的DNS
  5. 推荐一些学习嵌入式经典的书籍
  6. 学习计算机组成原理课程,推荐书籍,写CPU(随做更新
  7. 跑马灯C语言实验报告,51单片机跑马灯实验报告 分析与小结,思考题源码下载
  8. CF Canada Cup 2016 D 优先队列
  9. 如何完整保存离线网页
  10. 个人理财--知识点总结