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

news2025/8/3 17:36:24

先说简单的使用

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) { //如果不= quote
        if (c == this.separator && !inQuotes) { // 如果=分割符并且没有被quote
            tokensOnThisLine.add(sb.toString());
            sb.setLength(0);
            this.inField = false;
        } else if (!this.strictQuotes || inQuotes) {
            sb.append(c);
            this.inField = true;
        }
    } else { //这个else 说明当前字符就是quote
        if (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的方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/34774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt第二十三章:设置窗口、控件背景颜色

修改样式表&#xff1a;设置后发现影响所有控件内的背景色事件触发样式&#xff1a;鼠标划过触发样式设置背景图背景图打包。 py代码中引用 将resources.qrc文件进行转化成py文件 在我们将xxx.ui文件转换成py文件的时候会自动引用resources.qrc 实际使用中发现&#xff1a;back…

Linux系统认知——常用命令(全)

文章目录一、帮助命令1.man&#xff08;查看帮助手册&#xff09;2.info&#xff08;阅读 info 格式的文档&#xff09;3.whatis&#xff08;查询命令功能&#xff09;二、文件及目录相关命令1.touch&#xff08;创建新的空文件&#xff0c;改变已有文件的时间戳&#xff09;2.…

黑马学员放弃20K月薪投身比亚迪,是去「车间」打螺丝吗?

黑马学员进互联网企业的新闻不稀奇&#xff0c;但黑马学员进“工厂”的新闻&#xff0c;就稀奇了。 黑马学员&#xff0c;互联网人&#xff0c;“工厂”&#xff0c;这几个词放在一起&#xff0c;怎么看怎么不顺眼。甚至有人会觉得魔幻&#xff0c;敲代码的、搞设计的脑力工作…

数据技术前沿趋势、TiDB 产品方向、真实场景 Demo… 丨PingCAP DevCon 2022 产品技术论坛预览

现在报名活动&#xff0c;有机会获得限定好礼哦&#xff01;&#x1f446; 2022 年 5 月&#xff0c;TiDB 进入了 V6 时代。从 TiDB 第一个 Beta 版本开始&#xff0c;OLTP Scale、Real-time HTAP、TiDB Cloud&#xff0c;我们一步步把理念变成现实。 现在&#xff0c;数据库技…

如何保护客户数据并降低合规风险

如何保护客户数据并降低合规风险 保护客户数据和降低合规风险通常是金融行业企业&#xff08;从银行到投资公司&#xff0c;再到小型&#xff0c;中型和大型企业的财务部门&#xff09;最关心的问题。 当财务文件是以纸质形式出现时&#xff0c;这些担忧会成倍增加&#xff…

关于api的响应时间(curl)

最近遇到了需要在服务器上测试第三方api响应时间的需求。那么&#xff0c;怎么测呢&#xff1f; curl安排上。 curl -w "dnslookup: %{time_namelookup} | connect: %{time_connect} | appconnect: %{time_appconnect} | pretransfer: %{time_pretransfer} | starttrans…

3.5 讲一讲关于小红书的搜索引流技巧【玩赚小红书】

“有一大部分女生把小红书当百度使用”&#xff0c;一句话道出了小红书流量的核心。 今天&#xff0c;我更想和大家聊聊如何获取同样巨大的搜索流量&#xff0c;让源源不断的精准客户主动找上门来。可别忽视了这个流量入口&#xff0c;它占据总体流量的 50% 以上。 ​ ​ 布局…

2022卡塔尔世界杯引爆全球,跨境电商如何做好选品和营销?

2022卡塔尔世界杯正如火如荼的举办着&#xff0c;热度席卷全球。足球皇帝Franz Beckenbauer曾说&#xff1a;“在绿茵场上滚动的不是足球&#xff0c;而是黄金。”从商业价值论&#xff0c;世界杯的品牌价值世界第一&#xff0c;是奥运会的8倍。据Nox聚星了解&#xff0c;2022年…

centos7.9安装postgresql12

目录 1.下载安装包 2.安装 首先登陆官方网站下载 PostgreSQL: Downloads 1.下载安装包 按照官方的命令安装&#xff1a; # 下载PGSQL的rpm包 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm #…

基于STM32G431嵌入式学习笔记——六、串口中断实例(基于第12届蓝桥杯串口部分题目)

上一节我们初步了解了中断的配置、串口的调试以及中断处理子程序的定义&#xff0c;接下来我们就来学习一下具体如何去应用串口中断。 一、真题引入 1.功能概述 2.串口功能 二、环境配置 我们依旧以第四节完成的第12届蓝桥杯节选题为初始环境进行配置&#xff0c;复制出…

Linux|centos7 Prometheus的自动服务发现 一(文件发现机制)

前言&#xff1a; Prometheus作为一个监控神器&#xff0c;深受大家的喜爱&#xff0c;那么如何使用它是一个问题&#xff0c;如何用好它又是一个问题了。 本文以centos7操作系统下搭建的Prometheus server为例&#xff0c;讲解基于文件发现新的采集器。 一&#xff0c; Pr…

【FLASH存储器系列十二】Nand Flash芯片使用指导之二

目录 1.1 芯片指令集 1.2 READ PAGE&#xff08;00h–30h&#xff09; 1.3 READ PAGE CACHE SEQUENTIAL (31h) 1.4 READ PAGE CACHE RANDOM (00h-31h) 1.5 PROGRAM PAGE&#xff08;80h-10h&#xff09; 1.6 PROGRAM PAGE CACHE (80h-15h) 1.7 ERASE BLOCK (60h-D0h) 上…

pytorch深度学习实战lesson26

第二十六课 GoogLeNet 这节课学习Googlenet &#xff0c; 虽然 nin 现在几乎没有被使用&#xff0c;但是 Googlenet 还是在大量的被使用。在比如说 Google 内部当然是用的挺多的&#xff0c;在外面也是被经常使用。这个网络当时候出来的时候也是吓了大家一跳。 如上图所示&…

到底该怎么学python啊?

前言 大家都说找工作有金九银十&#xff0c;经过了金九银十之后&#xff0c;很多小伙伴都纷纷入职了各家企业&#xff0c;在各个企业中扮演者不同的角色&#xff0c;其中我接触最多的就是算法工程师和Python开发工程师&#xff0c;也跟其他企业的相关技术负责人交流过&#xf…

11月25日:tp框架中的架构,配置,路由,控制器

tp框架的主要内容 架构&#xff1a; https://static.kancloud.cn/manual/thinkphp5/118010 配置&#xff1a; 配置文件主要位置 可以使用Config::load()调用thinkphp中的静态方法&#xff0c;显示出config.php的主要内容 路由&#xff1a; 图中可见 使用url::调用静态方法…

Spring Boot集成Easypoi导出Excel

目录 1.引入Maven依赖 2.实体类属性加上Excel注解 3.导出示例 4.导出结果 5.注解Excel说明 1.引入Maven依赖 <!--easypoi依赖&#xff08;表格导入导出&#xff09;--> <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-sp…

【愚公系列】2022年11月 数据库-数据库文档生成工具SmartSQL使用

文章目录前言一、数据库文档生成工具SmartSQL使用1.SmartSQL的功能介绍2.运行3.连接数据库4.分组管理5.数据表相关功能6.导入导出7.文档截图7.1 CHM文档7.2 MD文档ABTABAC_MAPPING 7.3 EXCEL文档7.4 PDF文档7.5 HTML文档7.6 XML文档7.7 JSON文档前言 SmartSQL 是一款方便、快捷…

Photographic Tone Reproduction for Digital Images

Abstract 经典的摄影任务是将现实世界亮度的潜在高动态范围映射到摄影印刷品的低动态范围。将数字图像映射到低动态范围的打印或屏幕的计算机图形从业者也面临着这种音调再现问题。本文介绍的工作利用了经过时间考验的摄影实践技术来开发新的色调再现算子。特别是&#xff0c;…

进程的调度

目录 1. 进程的概念 2.进程是如何被调度的 2.1描述 2.2 组织 2.3 PCB中描述的进程特征 2.4 进程调度的相关属性&#xff08;接2.3&#xff09; 3. 内存管理 1. 进程的概念 一个跑起来的程序就称之为进程(没跑起来就不是进程) 进程是操作系统分配资源的基本单位。 2.进程…

说说原型(prototype)、原型链

1、原型 prototype 和 proto 每个对象都有一个__proto__属性&#xff0c;并且指向它的prototype原型对象 每个构造函数都有一个prototype原型对象 prototype原型对象里的constructor指向构造函数本身 看一下代码就清楚了 function Person(nick, age){this.nick nick;this.…