Day36 - Java基础加强 - 1.xml


1.xml

1.1概述

  • 万维网联盟(W3C)

    万维网联盟(W3C)创建于1994年,又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。建立者: Tim Berners-Lee (蒂姆·伯纳斯·李)。是Web技术领域最具权威和影响力的国际中立性技术标准机构。到目前为止,W3C已发布了200多项影响深远的Web技术标准及实施指南,

    • 如广为业界采用的超文本标记语言HTML(标准通用标记语言下的一个应用)、

    • 可扩展标记语言XML(标准通用标记语言下的一个子集)、

    • 以及帮助残障人士有效获得Web信息的无障碍指南(WCAG)等。

  • xml概述

    XML的全称为(EXtensible Markup Language),是一种可扩展的标记语言。标记语言: 通过标签来描述数据的一门语言(标签有时我们也将其称之为元素)。可扩展:标签的名字是可以自定义的,XML文件是由很多标签组成的,而标签名是可以自定义的。

  • 作用

    • 用于进行存储数据和传输数据。

    • 作为软件的配置文件。

  • 作为配置文件的优势

    • 可读性好。

    • 可维护性高。

🧠 理论理解

W3C(万维网联盟)是Web领域最权威的标准组织,XML作为其核心标准之一,具有“可扩展、通用、跨平台”的特性。XML定义了一种结构化数据的标记语言,它通过自定义标签实现对数据的灵活描述,广泛应用于数据传输、配置文件等场景。相比HTML,XML的重点是数据的存储和结构表达,而非页面展示。

XML的优势:

  • 自定义标签,强扩展性;

  • 可读性强,跨语言、跨平台;

  • 适用于数据交换和系统集成。

🛠 企业实战理解

阿里巴巴:早期RPC框架中,Dubbo曾用XML配置服务暴露及引用关系,利于分布式系统治理。
字节跳动:飞书和抖音App的部分配置热更新机制使用XML作为数据格式,便于跨端解析。
Google:在Android开发中,XML被广泛用于界面布局、资源配置(如AndroidManifest.xml)。
英伟达:GPU云平台管理系统中,曾用XML描述虚拟机镜像和网络拓扑结构。
OpenAI:早期GPT模型的微调任务中使用XML存储测试集元数据,保障格式一致性。

 

面试题(字节跳动):

XML相比JSON,有哪些优势和不足?为什么在Android开发中广泛使用XML而不是JSON?

答案:
✅ XML的优势:

  • 支持复杂层级和结构化数据;

  • 自定义标签,强可读性;

  • 可集成DTD/Schema进行数据校验;

  • 跨平台解析库成熟。

✅ XML的不足:

  • 数据量冗余大(标签较多);

  • 解析速度和体积劣于JSON。

✅ Android选择XML的原因:

  • 界面布局(UI)天然适合树状结构

  • Google官方组件(如布局文件、资源文件)均基于XML;

  • 解析时无需第三方库,系统自带支持。

场景题(字节跳动):

你在开发一个跨国短视频应用,后台接口用JSON传输,但配置中心选择了XML格式存储。领导问你为什么不用JSON来做配置文件,怎么解释?

答案:
✅ 我的解释是:
虽然JSON轻量、解析速度快,但在复杂层级、注释能力、结构校验等方面,XML更占优势。配置文件需要:

  • 明确层级结构(支持多层嵌套);

  • 支持DTD/Schema进行结构化校验,保证格式稳定;

  • 可添加详细注释,方便多人协作理解。

因此,像跨国应用这种对配置文件可读性、健壮性要求高的场景,XML是更可靠的方案。例如,我们的Android资源文件、Manifest文件也是用XML实现的,验证了其在配置类场景的成熟度。

 

1.2标签的规则

  • 标签由一对尖括号和合法标识符组成

    <student>
    
  • 标签必须成对出现

    <student> </student>
    
  • 特殊的标签可以不成对,但必须有结束标记

    <address/>
    
  • 标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来

    <student id="1"> </student>
    
  • 标签需要正确的嵌套

    正确: <student id="1"> <name>张三</name> </student>
    错误: <student id="1"><name>张三</student></name>
    

🧠 理论理解

XML标签必须遵守严格的格式规则,包括:

  • 成对出现(或自闭合);

  • 属性必须加引号;

  • 标签必须正确嵌套,不能交叉嵌套。

这些规则确保了XML数据的结构性解析友好性,与HTML的宽容不同,XML是强约束的标记语言。

🛠 企业实战理解

阿里巴巴:在数据中台建设中,曾用XML定义ETL任务流,要求格式严格,否则任务调度失败。
字节跳动:在跨端文件传输场景,使用XML时特别强调标签嵌套规范,防止因为换行或多余空格导致解析异常。
Google:Android Studio会实时提示XML标签错误,保障界面布局文件合法。
美团:物流配送数据的历史存档格式曾用XML封装,标签错误会导致解析异常,中断配送数据回放。

 

面试题(阿里巴巴):

请说出以下XML的错误点,并解释为什么解析器会报错:

<student id="1">
  <name>张三</name>
  <age>23</age>
<student>

答案:
❌ 错误点:

  • 结束标签写成 <student> 而不是 </student>,缺少 /

  • 造成标签不闭合,违反XML标签必须成对出现的规则。

✅ 解析器会报:
org.xml.sax.SAXParseException: The element type "student" must be terminated by the matching end-tag "</student>".

场景题(阿里巴巴):

你接手了一个老系统,发现生产环境有时XML解析失败,报“标签未闭合”的错误,你会怎么排查定位?

答案:
✅ 排查思路:
1️⃣ 初步定位:确认出错的XML文件路径和源数据,复现错误。
2️⃣ 检查生成环节:查看是否是动态拼接XML字符串,容易出现标签遗漏、手写闭合错误。
3️⃣ 查日志或版本历史:是否近期上线修改过结构,导致拼接逻辑破坏了嵌套结构。
4️⃣ 验证格式

  • 使用xmllint等工具校验格式;

  • 检查是否存在非法字符导致标签被截断,如< > &未转义。
    5️⃣ 方案优化:强烈建议用XML库生成XML(如Dom4j、JAXP),不要用手写字符串拼接,避免此类低级错误反复发生。

 

1.3语法规则

  • 语法规则

    • XML文件的后缀名为:.xml

    • 文档声明必须是第一行第一列

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      
    • 必须存在一个根标签,有且只能有一个。

    • XML文件中可以定义注释信息。

    • XML文件中可以存在以下特殊字符

      &lt; < 小于
      &gt; > 大于
      &amp; & 和号
      &apos; ' 单引号
      &quot; " 引号
      
    • XML文件中可以存在CDATA区

      <![CDATA[ …内容… ]]>
      
  • 示例代码

    <?xml version="1.0" encoding="UTF-8" ?>
    <!--注释的内容-->
    <students>
        <student id="1">
            <name>张三</name>
            <age>23</age>
            <info>学生&lt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;的信息</info>
            <message> <![CDATA[内容 <<<<<< >>>>>> ]]> </message>
        </student>
        <student id="2">
            <name>李四</name>
            <age>24</age>
        </student>
    </students>
    

🧠 理论理解

XML的语法要求包括:

  • 文件声明必须在首行(定义版本、编码、独立性);

  • 必须有唯一根元素;

  • 支持注释、特殊字符(如&lt;)、CDATA区块等。

XML文件的格式高度标准化,这使其在数据交换时更易校验,并保障跨平台兼容性。

🛠 企业实战理解

阿里巴巴:在大促期间配置支付网关策略时,曾因XML声明缺失导致网关配置加载失败。
字节跳动:开发直播间动态弹幕模块时,使用CDATA包裹emoji和特殊符号,防止破坏XML结构。
OpenAI:在模型配置导入时,使用XML声明UTF-8防止中文乱码问题,尤其在跨国数据环境下尤为重要。

 

面试题(Google):

解释&lt;&gt;&amp;等转义字符的用途,如果XML中直接写<info>学生信息:<优等生></info>会发生什么问题?

答案:
✅ 作用:这些是特殊字符转义符,解决内容中存在< > & ' "时与标签冲突的问题。

⚠️ 如果直接写<info>学生信息:<优等生></info>,解析器会把<优等生>当作新的子标签,导致结构错乱或报错

SAXParseException: The element type "优等生" must be terminated by the matching end-tag.

✅ 正确写法应为:
<info>学生信息:&lt;优等生&gt;</info>

场景题(Google):

某次生产事故中,发现Android应用部分界面在海外出现乱码,定位到XML布局文件,问题是XML声明缺少encoding,为什么会导致乱码?

答案:
✅ 原因:
XML默认声明格式是:<?xml version="1.0" encoding="UTF-8"?>
如果不声明encoding,解析器会根据默认的系统编码(如ISO-8859-1)解析,尤其在多语言环境(海外、不同服务器系统)下,默认编码可能不同,导致非ASCII字符(如中文、表情)乱码

✅ 解决方案:
强制在XML声明中添加encoding="UTF-8"确保字符集一致,尤其是国际化项目必须严格规定编码规范,避免因编码问题导致UI、数据展示异常。

 

1.4xml解析

  • 概述

    xml解析就是从xml中获取到数据。

  • 常见的解析思想

    DOM(Document Object Model)文档对象模型:会把xml文件全部加载到内存,在内存中形成一个树形结构,再获取对应的值。

  • 常见的解析工具

    • JAXP

    • JDOM

    • DOM4J

    • pull (Android应用)

  • 代码实现

    public class Student {
        private String id;
        private String name;
        private int age;
        // ...省略getter/setter/toString
    }
    
    public class XmlParse {
        public static void main(String[] args) throws DocumentException {
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(new File("myxml/xml/student.xml"));
            Element rootElement = document.getRootElement();
            List<Element> studentElements = rootElement.elements("student");
            ArrayList<Student> list = new ArrayList<>();
            for (Element element : studentElements) {
                String id = element.attributeValue("id");
                String name = element.elementText("name");
                String age = element.elementText("age");
                Student s = new Student(id, name, Integer.parseInt(age));
                list.add(s);
            }
            for (Student student : list) {
                System.out.println(student);
            }
        }
    }
    

🧠 理论理解

XML解析的核心是从文本中提取结构化数据。DOM解析是一种常用策略,它把整个XML文档加载进内存形成树状结构,优点是易遍历、易修改,缺点是内存占用大。除了DOM,还有SAX、StAX、Pull等流式解析器,适合大文件处理。

🛠 企业实战理解

字节跳动:抖音短视频的素材描述文件采用DOM解析,处理速度快、易用;大文件则用SAX减少内存消耗。
阿里巴巴:支付链路日志的结构化导入用DOM4J解析配置文件,快速定位参数问题。
Google:Android系统用Pull解析器处理大体积XML(如短信备份),兼顾性能和稳定性。
英伟达:GPU虚拟化环境的配置文件采用JDOM解析,定期动态加载更新。

 

面试题(美团):

DOM解析方式和SAX解析方式有什么区别?项目中大文件解析时该怎么选?

答案:

对比点DOM解析SAX解析
工作机制加载整个文档到内存,形成树形结构基于事件驱动,逐行解析
内存占用
操作灵活性可增删改,随机访问只读,顺序访问
适用场景小文件、修改频繁的场景大文件、流式解析

✅ 大文件推荐SAX,节省内存且高效。

1.5DTD约束

  • 什么是约束

    用来限定xml文件中可使用的标签以及属性。

  • 约束的分类

    • DTD

    • schema

  • 编写DTD约束

    <!ELEMENT persons (person)>
    <!ELEMENT person (name,age)>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
    
  • 引入DTD约束

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE persons SYSTEM 'persondtd.dtd'>
    <persons>
        <person>
            <name>张三</name>
            <age>23</age>
        </person>
    </persons>
    

🧠 理论理解

DTD是XML的第一代约束机制,它用于定义XML中允许出现的元素、属性及其结构关系。DTD语法较为简单,主要通过<!ELEMENT><!ATTLIST>定义元素和属性结构。它能够提高XML的可靠性和校验性,但存在局限:不支持复杂数据类型、扩展性弱、非XML格式。

🛠 企业实战理解

阿里巴巴:在早期电商系统的订单数据校验中,用DTD限制订单XML格式,保障数据一致性。
字节跳动:曾用DTD校验日志采集的XML数据,避免因开发者自定义错误导致日志异常。
美团:大数据部门批量接入外部数据源时,用DTD做格式预校验,防止结构不一致。
Google:虽然已很少用DTD,但在XML标准早期版本仍沿用其作为历史兼容方案。

 

面试题(腾讯):

写出DTD的作用是什么?DTD中如何定义一个student元素包含nameage两个子元素,并且student标签必须有id属性?

答案:
✅ DTD作用:定义XML允许出现的标签、属性、结构顺序等,帮助进行结构校验

✅ 定义示例:

<!ELEMENT student (name, age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST student id CDATA #REQUIRED>

 

场景题(美团):

你在项目中使用DOM解析大文件(1GB),出现内存溢出(OutOfMemoryError),怎么优化?

答案:
✅ 分析问题:
DOM会一次性加载整个XML文件到内存,文件大时极易造成内存爆炸。

✅ 优化方案:

  • 切换解析方式:使用SAX或StAX解析(基于事件流式解析),即使是超大文件,也只占用很少内存;

  • 分片处理:将1GB的大文件拆分为多个小XML文件单独解析;

  • 按需提取:确认是否真的需要全量加载,能否按条件筛选,避免无用数据加载;

  • 资源回收:确保解析完毕后手动释放资源,避免内存泄漏。

👉 实际中,我们团队会用SAXReader+Handler方式,处理百万级订单XML文件也能稳定运行。

场景题(腾讯):

外部供应商提供的订单XML文件经常校验失败,报“DTD校验不通过”,你怎么应对,如何设计DTD更健壮?

答案:
✅ 解决思路:
1️⃣ 首先定位问题:确认是否是供应商文件格式变化,或DTD过于严格导致校验失败。
2️⃣ 改进DTD

  • **使用|***放宽匹配范围,例如<ELEMENT order (item*)>允许无商品也合法;

  • 属性加#IMPLIED,将非核心属性改为可选,避免因为缺少属性导致校验失败;

  • 文档说明完善:在DTD文件内添加清晰的注释说明,帮助外部方理解规则。
    3️⃣ 版本控制:如果供应商不断扩展XML格式,建议通过version字段区分版本,维护多个DTD文件。

👉 我们有一次大促中,快速加了item?让订单可以无商品通过校验,防止了系统异常

1.6schema约束

  • schema和dtd的区别

    1. schema约束文件是xml文件,后缀名为.xsd。

    2. 一个xml可以引用多个schema文件,使用名称空间区分。

    3. schema支持更多数据类型。

    4. schema语法更复杂。

  • 编写schema约束

    <?xml version="1.0" encoding="UTF-8" ?>
    <schema
        xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.itheima.cn/javase"
        elementFormDefault="qualified"
    >
        <element name="persons">
            <complexType>
                <sequence>
                    <element name="person">
                        <complexType>
                            <sequence>
                                <element name="name" type="string"/>
                                <element name="age" type="string"/>
                            </sequence>
                            <attribute name="id" type="string" use="required"/>
                        </complexType>
                    </element>
                </sequence>
            </complexType>
        </element>
    </schema>
    
  • 引入schema约束

    <?xml version="1.0" encoding="UTF-8" ?>
    <persons
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.itheima.cn/javase"
        xsi:schemaLocation="http://www.itheima.cn/javase person.xsd"
    >
        <person id="001">
            <name>张三</name>
            <age>23</age>
        </person>
    </persons>
    

🧠 理论理解

Schema是DTD的增强版,它本身就是一个XML文档,支持:

  • 多命名空间;

  • 丰富的数据类型(如整数、日期);

  • 定义复杂结构(如嵌套属性、复合元素);

  • 更好的扩展性与兼容性。

Schema提升了XML的表达力和严谨性,被视为现代XML校验的首选标准。

🛠 企业实战理解

字节跳动:数据治理平台使用Schema约束不同业务方上报的XML数据,支持灵活定义数据类型与约束条件。
阿里巴巴:在跨境支付中,Schema用于定义国际清算标准,保障数据精确符合规范。
英伟达:在GPU云平台,Schema用于描述硬件资源API接口,支持高精度数据校验。
Google:Android中Gradle插件配置文件基于Schema校验,保证构建环境一致性。
OpenAI:在大规模模型测试时,Schema被用来约束测试集输入输出格式,确保数据自动化处理无误。

 

面试题(OpenAI):

Schema相比DTD有哪些增强?请写出如何用Schema定义student元素,包含id属性(必填)、name(字符串)、age(整数)两个子元素。

答案:
✅ Schema增强点:

  • 支持复杂数据类型(如整数、日期);

  • 本身是XML格式,可嵌套、扩展;

  • 支持多命名空间

  • 可复用(类型定义、引用)。

✅ 定义示例:

<element name="student">
  <complexType>
    <sequence>
      <element name="name" type="string"/>
      <element name="age" type="integer"/>
    </sequence>
    <attribute name="id" type="string" use="required"/>
  </complexType>
</element>

场景题(OpenAI):

你在AI模型接口中用XML传输输入输出数据,schema校验时经常报错“数据类型不匹配”,你会怎么排查并改进?

答案:
✅ 排查步骤:
1️⃣ 确认schema文件:检查<element>定义的数据类型是否符合实际需求,如integerdateTime等是否被误用为string
2️⃣ 检查输入数据

  • 确保数字字段没有意外的字符串内容(如age="25岁"应改为25);

  • 日期时间字段严格符合ISO标准格式(如2024-05-06T10:00:00Z)。
    3️⃣ 数据格式兼容:某些接口返回null或空值,检查schema是否允许可选字段(用minOccurs="0"等标记)。
    4️⃣ 调试工具:用xmllint --schemaXMLSpy等工具逐步验证,定位具体出错节点。

✅ 改进建议:

  • 使用自定义简单类型限制数据格式;

  • 测试多组边界值提前发现潜在问题;

  • 定期和AI模型研发团队同步接口文档,确保XML schema与实际接口一致。

👉 我们团队在OpenAI接口对接中,也曾因日期格式不规范,导致生产环境校验失败,后来通过增强schema定义解决问题。

 


package com.edu.test; import com.edu.po.Person; import com.edu.utils.HiveUtils; import com.edu.utils.JdbcUtils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; /* * 任务说明: * 1. 把 hive 的表读取出来。 * 2. 把数据转入到 mysql。 * 3. 可以在 web 工程中读取 mysql 数据。 * (web 工程有 jar 冲突问题, 这里间接去读取 hive 数据) * 4. 展示在页面。 */ public class Task1 { /* 数据项: [day_time], [total_msg_cnt] */ static List<Person> getHiveData() throws SQLException { Connection conn = HiveUtils.getConnection(); String SQL = "SELECT CAST(day_time AS STRING) AS day_time, total_msg_cnt FROM total_msg_cnt"; PreparedStatement psmt = conn.prepareStatement(SQL); ResultSet rs = psmt.executeQuery(); List<Person> list = new ArrayList(); while( rs.next() ){ Person p = packPerson( rs ); list.add( p ); System.out.println( p ); } rs.close(); psmt.close(); HiveUtils.closeConnection(); //关闭 hive 连接 System.out.println("+-----------------------------------+"); System.out.println("{TASK1-HIVE}运行完成.."); System.out.println("+-----------------------------------+"); return list; } static Person packPerson(ResultSet rs) throws SQLException { Person p = new Person(); String day_time = rs.getString(1); Long total_msg_cnt = rs.getLong(2); p.setDay_time( day_time ); p.setTotal_msg_cnt( total_msg_cnt ); return p; } public static void main(String[] args) throws SQLException { List<Person> hiveData = getHiveData(); for (Person p : hiveData) { if (p.getDay_time() == null || p.getDay_time().isEmpty()) { System.out.println("发现空值:" + p); } } //2.转存到 MYSQL 中。 writeToMYSQL(hiveData); } /* 2.转存到 MYSQL 中。 */ static void writeToMYSQL(List<Person> hiveData) throws SQLException { // 1. 获取 MySQL 连接 Connection conn = JdbcUtils.getConnection(); String SQL = "INSERT INTO total_msg_cnt (day_time, total_msg_cnt) VALUES (?, ?)"; PreparedStatement psmt = conn.prepareStatement(SQL); for (Person p : hiveData) { psmt.setString(1, p.getDay_time()); psmt.setLong(2, p.getTotal_msg_cnt()); psmt.addBatch(); } psmt.executeBatch(); psmt.close(); JdbcUtils.closeConnection(); System.out.println("+-----------------------------------+"); System.out.println("{TASK1-MYSQL}运行完成."); System.out.println("+-----------------------------------+"); } } D:\flinkjava\Java\jdk1.8.0_281\bin\java.exe "-javaagent:D:\jetbra\IntelliJ IDEA 2023.2.8\lib\idea_rt.jar=60730:D:\jetbra\IntelliJ IDEA 2023.2.8\bin" -Dfile.encoding=UTF-8 -classpath D:\flinkjava\Java\jdk1.8.0_281\jre\lib\charsets.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\deploy.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\ext\access-bridge-64.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\ext\cldrdata.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\ext\dnsns.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\ext\jaccess.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\ext\jfxrt.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\ext\localedata.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\ext\nashorn.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\ext\sunec.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\ext\sunjce_provider.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\ext\sunmscapi.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\ext\sunpkcs11.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\ext\zipfs.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\javaws.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\jce.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\jfr.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\jfxswt.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\jsse.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\management-agent.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\plugin.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\resources.jar;D:\flinkjava\Java\jdk1.8.0_281\jre\lib\rt.jar;D:\spark资料\hive-to-mysql\target\classes;C:\Users\sb171\.m2\repository\org\apache\hive\hive-jdbc\3.1.2\hive-jdbc-3.1.2.jar;C:\Users\sb171\.m2\repository\org\apache\hive\hive-common\3.1.2\hive-common-3.1.2.jar;C:\Users\sb171\.m2\repository\org\apache\hive\hive-classification\3.1.2\hive-classification-3.1.2.jar;C:\Users\sb171\.m2\repository\org\apache\hive\hive-storage-api\2.7.0\hive-storage-api-2.7.0.jar;C:\Users\sb171\.m2\repository\commons-cli\commons-cli\1.2\commons-cli-1.2.jar;C:\Users\sb171\.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;C:\Users\sb171\.m2\repository\org\apache\commons\commons-lang3\3.2\commons-lang3-3.2.jar;C:\Users\sb171\.m2\repository\org\apache\orc\orc-core\1.5.6\orc-core-1.5.6.jar;C:\Users\sb171\.m2\repository\org\apache\orc\orc-shims\1.5.6\orc-shims-1.5.6.jar;C:\Users\sb171\.m2\repository\io\airlift\aircompressor\0.10\aircompressor-0.10.jar;C:\Users\sb171\.m2\repository\javax\xml\bind\jaxb-api\2.2.11\jaxb-api-2.2.11.jar;C:\Users\sb171\.m2\repository\org\apache\hadoop\hadoop-hdfs\2.2.0\hadoop-hdfs-2.2.0.jar;C:\Users\sb171\.m2\repository\com\sun\jersey\jersey-core\1.9\jersey-core-1.9.jar;C:\Users\sb171\.m2\repository\com\sun\jersey\jersey-server\1.9\jersey-server-1.9.jar;C:\Users\sb171\.m2\repository\asm\asm\3.1\asm-3.1.jar;C:\Users\sb171\.m2\repository\xmlenc\xmlenc\0.52\xmlenc-0.52.jar;C:\Users\sb171\.m2\repository\jline\jline\2.12\jline-2.12.jar;C:\Users\sb171\.m2\repository\javax\servlet\javax.servlet-api\3.1.0\javax.servlet-api-3.1.0.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\jetty-http\9.3.20.v20170531\jetty-http-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\jetty-util\9.3.20.v20170531\jetty-util-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\jetty-rewrite\9.3.20.v20170531\jetty-rewrite-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\jetty-client\9.3.20.v20170531\jetty-client-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\jetty-server\9.3.20.v20170531\jetty-server-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\jetty-io\9.3.20.v20170531\jetty-io-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\jetty-servlet\9.3.20.v20170531\jetty-servlet-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\jetty-security\9.3.20.v20170531\jetty-security-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\jetty-webapp\9.3.20.v20170531\jetty-webapp-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\jetty-xml\9.3.20.v20170531\jetty-xml-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\joda-time\joda-time\2.9.9\joda-time-2.9.9.jar;C:\Users\sb171\.m2\repository\org\apache\logging\log4j\log4j-1.2-api\2.10.0\log4j-1.2-api-2.10.0.jar;C:\Users\sb171\.m2\repository\org\apache\logging\log4j\log4j-api\2.10.0\log4j-api-2.10.0.jar;C:\Users\sb171\.m2\repository\org\apache\logging\log4j\log4j-core\2.10.0\log4j-core-2.10.0.jar;C:\Users\sb171\.m2\repository\org\apache\logging\log4j\log4j-web\2.10.0\log4j-web-2.10.0.jar;C:\Users\sb171\.m2\repository\org\apache\commons\commons-compress\1.9\commons-compress-1.9.jar;C:\Users\sb171\.m2\repository\org\apache\ant\ant\1.9.1\ant-1.9.1.jar;C:\Users\sb171\.m2\repository\org\apache\ant\ant-launcher\1.9.1\ant-launcher-1.9.1.jar;C:\Users\sb171\.m2\repository\net\sf\jpam\jpam\1.1\jpam-1.1.jar;C:\Users\sb171\.m2\repository\com\tdunning\json\1.8\json-1.8.jar;C:\Users\sb171\.m2\repository\io\dropwizard\metrics\metrics-core\3.1.0\metrics-core-3.1.0.jar;C:\Users\sb171\.m2\repository\io\dropwizard\metrics\metrics-jvm\3.1.0\metrics-jvm-3.1.0.jar;C:\Users\sb171\.m2\repository\io\dropwizard\metrics\metrics-json\3.1.0\metrics-json-3.1.0.jar;C:\Users\sb171\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.9.5\jackson-databind-2.9.5.jar;C:\Users\sb171\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;C:\Users\sb171\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.9.5\jackson-core-2.9.5.jar;C:\Users\sb171\.m2\repository\com\github\joshelser\dropwizard-metrics-hadoop-metrics2-reporter\0.1.2\dropwizard-metrics-hadoop-metrics2-reporter-0.1.2.jar;C:\Users\sb171\.m2\repository\org\apache\hadoop\hadoop-common\2.6.0\hadoop-common-2.6.0.jar;C:\Users\sb171\.m2\repository\org\apache\hadoop\hadoop-annotations\2.6.0\hadoop-annotations-2.6.0.jar;C:\Users\sb171\.m2\repository\org\apache\commons\commons-math3\3.1.1\commons-math3-3.1.1.jar;C:\Users\sb171\.m2\repository\commons-httpclient\commons-httpclient\3.1\commons-httpclient-3.1.jar;C:\Users\sb171\.m2\repository\commons-net\commons-net\3.1\commons-net-3.1.jar;C:\Users\sb171\.m2\repository\commons-collections\commons-collections\3.2.1\commons-collections-3.2.1.jar;C:\Users\sb171\.m2\repository\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar;C:\Users\sb171\.m2\repository\org\mortbay\jetty\jetty\6.1.26\jetty-6.1.26.jar;C:\Users\sb171\.m2\repository\org\mortbay\jetty\jetty-util\6.1.26\jetty-util-6.1.26.jar;C:\Users\sb171\.m2\repository\com\sun\jersey\jersey-json\1.9\jersey-json-1.9.jar;C:\Users\sb171\.m2\repository\com\sun\xml\bind\jaxb-impl\2.2.3-1\jaxb-impl-2.2.3-1.jar;C:\Users\sb171\.m2\repository\org\codehaus\jackson\jackson-jaxrs\1.8.3\jackson-jaxrs-1.8.3.jar;C:\Users\sb171\.m2\repository\org\codehaus\jackson\jackson-xc\1.8.3\jackson-xc-1.8.3.jar;C:\Users\sb171\.m2\repository\tomcat\jasper-compiler\5.5.23\jasper-compiler-5.5.23.jar;C:\Users\sb171\.m2\repository\tomcat\jasper-runtime\5.5.23\jasper-runtime-5.5.23.jar;C:\Users\sb171\.m2\repository\javax\servlet\jsp\jsp-api\2.1\jsp-api-2.1.jar;C:\Users\sb171\.m2\repository\commons-el\commons-el\1.0\commons-el-1.0.jar;C:\Users\sb171\.m2\repository\net\java\dev\jets3t\jets3t\0.9.0\jets3t-0.9.0.jar;C:\Users\sb171\.m2\repository\com\jamesmurty\utils\java-xmlbuilder\0.4\java-xmlbuilder-0.4.jar;C:\Users\sb171\.m2\repository\commons-configuration\commons-configuration\1.6\commons-configuration-1.6.jar;C:\Users\sb171\.m2\repository\commons-digester\commons-digester\1.8\commons-digester-1.8.jar;C:\Users\sb171\.m2\repository\commons-beanutils\commons-beanutils\1.7.0\commons-beanutils-1.7.0.jar;C:\Users\sb171\.m2\repository\commons-beanutils\commons-beanutils-core\1.8.0\commons-beanutils-core-1.8.0.jar;C:\Users\sb171\.m2\repository\com\jcraft\jsch\0.1.42\jsch-0.1.42.jar;C:\Users\sb171\.m2\repository\org\htrace\htrace-core\3.0.4\htrace-core-3.0.4.jar;C:\Users\sb171\.m2\repository\javolution\javolution\5.5.1\javolution-5.5.1.jar;C:\Users\sb171\.m2\repository\org\apache\hive\hive-service\3.1.2\hive-service-3.1.2.jar;C:\Users\sb171\.m2\repository\org\apache\hive\hive-llap-server\3.1.2\hive-llap-server-3.1.2.jar;C:\Users\sb171\.m2\repository\org\apache\hive\hive-llap-common\3.1.2\hive-llap-common-3.1.2.jar;C:\Users\sb171\.m2\repository\org\apache\hive\hive-llap-client\3.1.2\hive-llap-client-3.1.2.jar;C:\Users\sb171\.m2\repository\org\apache\hive\hive-llap-tez\3.1.2\hive-llap-tez-3.1.2.jar;C:\Users\sb171\.m2\repository\io\netty\netty-all\4.1.17.Final\netty-all-4.1.17.Final.jar;C:\Users\sb171\.m2\repository\org\codehaus\jettison\jettison\1.1\jettison-1.1.jar;C:\Users\sb171\.m2\repository\org\apache\hive\hive-llap-common\3.1.2\hive-llap-common-3.1.2-tests.jar;C:\Users\sb171\.m2\repository\org\apache\hbase\hbase-hadoop2-compat\2.0.0-alpha4\hbase-hadoop2-compat-2.0.0-alpha4.jar;C:\Users\sb171\.m2\repository\org\apache\hbase\hbase-metrics\2.0.0-alpha4\hbase-metrics-2.0.0-alpha4.jar;C:\Users\sb171\.m2\repository\org\apache\hbase\hbase-metrics-api\2.0.0-alpha4\hbase-metrics-api-2.0.0-alpha4.jar;C:\Users\sb171\.m2\repository\org\apache\hadoop\hadoop-mapreduce-client-core\2.7.1\hadoop-mapreduce-client-core-2.7.1.jar;C:\Users\sb171\.m2\repository\org\apache\hbase\hbase-server\2.0.0-alpha4\hbase-server-2.0.0-alpha4.jar;C:\Users\sb171\.m2\repository\org\apache\hbase\hbase-http\2.0.0-alpha4\hbase-http-2.0.0-alpha4.jar;C:\Users\sb171\.m2\repository\org\glassfish\jersey\core\jersey-server\2.25.1\jersey-server-2.25.1.jar;C:\Users\sb171\.m2\repository\org\glassfish\jersey\core\jersey-common\2.25.1\jersey-common-2.25.1.jar;C:\Users\sb171\.m2\repository\org\glassfish\jersey\bundles\repackaged\jersey-guava\2.25.1\jersey-guava-2.25.1.jar;C:\Users\sb171\.m2\repository\org\glassfish\hk2\osgi-resource-locator\1.0.1\osgi-resource-locator-1.0.1.jar;C:\Users\sb171\.m2\repository\org\glassfish\jersey\core\jersey-client\2.25.1\jersey-client-2.25.1.jar;C:\Users\sb171\.m2\repository\org\glassfish\jersey\media\jersey-media-jaxb\2.25.1\jersey-media-jaxb-2.25.1.jar;C:\Users\sb171\.m2\repository\org\glassfish\hk2\hk2-api\2.5.0-b32\hk2-api-2.5.0-b32.jar;C:\Users\sb171\.m2\repository\org\glassfish\hk2\hk2-utils\2.5.0-b32\hk2-utils-2.5.0-b32.jar;C:\Users\sb171\.m2\repository\org\glassfish\hk2\external\aopalliance-repackaged\2.5.0-b32\aopalliance-repackaged-2.5.0-b32.jar;C:\Users\sb171\.m2\repository\org\glassfish\hk2\external\javax.inject\2.5.0-b32\javax.inject-2.5.0-b32.jar;C:\Users\sb171\.m2\repository\org\glassfish\hk2\hk2-locator\2.5.0-b32\hk2-locator-2.5.0-b32.jar;C:\Users\sb171\.m2\repository\org\javassist\javassist\3.20.0-GA\javassist-3.20.0-GA.jar;C:\Users\sb171\.m2\repository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;C:\Users\sb171\.m2\repository\org\glassfish\jersey\containers\jersey-container-servlet-core\2.25.1\jersey-container-servlet-core-2.25.1.jar;C:\Users\sb171\.m2\repository\org\apache\hbase\hbase-procedure\2.0.0-alpha4\hbase-procedure-2.0.0-alpha4.jar;C:\Users\sb171\.m2\repository\org\apache\hbase\hbase-common\2.0.0-alpha4\hbase-common-2.0.0-alpha4-tests.jar;C:\Users\sb171\.m2\repository\org\apache\hbase\hbase-replication\2.0.0-alpha4\hbase-replication-2.0.0-alpha4.jar;C:\Users\sb171\.m2\repository\org\apache\hbase\hbase-prefix-tree\2.0.0-alpha4\hbase-prefix-tree-2.0.0-alpha4.jar;C:\Users\sb171\.m2\repository\org\apache\commons\commons-collections4\4.1\commons-collections4-4.1.jar;C:\Users\sb171\.m2\repository\org\glassfish\web\javax.servlet.jsp\2.3.2\javax.servlet.jsp-2.3.2.jar;C:\Users\sb171\.m2\repository\org\glassfish\javax.el\3.0.1-b12\javax.el-3.0.1-b12.jar;C:\Users\sb171\.m2\repository\javax\ws\rs\javax.ws.rs-api\2.0.1\javax.ws.rs-api-2.0.1.jar;C:\Users\sb171\.m2\repository\com\lmax\disruptor\3.3.6\disruptor-3.3.6.jar;C:\Users\sb171\.m2\repository\org\apache\hadoop\hadoop-distcp\2.7.1\hadoop-distcp-2.7.1.jar;C:\Users\sb171\.m2\repository\org\apache\hadoop\hadoop-client\2.7.1\hadoop-client-2.7.1.jar;C:\Users\sb171\.m2\repository\org\apache\hadoop\hadoop-mapreduce-client-app\2.7.1\hadoop-mapreduce-client-app-2.7.1.jar;C:\Users\sb171\.m2\repository\org\apache\hadoop\hadoop-mapreduce-client-common\2.7.1\hadoop-mapreduce-client-common-2.7.1.jar;C:\Users\sb171\.m2\repository\org\apache\hadoop\hadoop-yarn-client\2.7.1\hadoop-yarn-client-2.7.1.jar;C:\Users\sb171\.m2\repository\org\apache\hadoop\hadoop-mapreduce-client-shuffle\2.7.1\hadoop-mapreduce-client-shuffle-2.7.1.jar;C:\Users\sb171\.m2\repository\org\apache\hadoop\hadoop-mapreduce-client-jobclient\2.7.1\hadoop-mapreduce-client-jobclient-2.7.1.jar;C:\Users\sb171\.m2\repository\org\apache\hbase\hbase-mapreduce\2.0.0-alpha4\hbase-mapreduce-2.0.0-alpha4.jar;C:\Users\sb171\.m2\repository\org\apache\hbase\hbase-common\2.0.0-alpha4\hbase-common-2.0.0-alpha4.jar;C:\Users\sb171\.m2\repository\com\github\stephenc\findbugs\findbugs-annotations\1.3.9-1\findbugs-annotations-1.3.9-1.jar;C:\Users\sb171\.m2\repository\org\apache\hbase\hbase-hadoop-compat\2.0.0-alpha4\hbase-hadoop-compat-2.0.0-alpha4.jar;C:\Users\sb171\.m2\repository\javax\servlet\jsp\javax.servlet.jsp-api\2.3.1\javax.servlet.jsp-api-2.3.1.jar;C:\Users\sb171\.m2\repository\commons-codec\commons-codec\1.7\commons-codec-1.7.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\jetty-runner\9.3.20.v20170531\jetty-runner-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\jetty-plus\9.3.20.v20170531\jetty-plus-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\jetty-annotations\9.3.20.v20170531\jetty-annotations-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\javax\annotation\javax.annotation-api\1.2\javax.annotation-api-1.2.jar;C:\Users\sb171\.m2\repository\org\ow2\asm\asm\5.0.1\asm-5.0.1.jar;C:\Users\sb171\.m2\repository\org\ow2\asm\asm-commons\5.0.1\asm-commons-5.0.1.jar;C:\Users\sb171\.m2\repository\org\ow2\asm\asm-tree\5.0.1\asm-tree-5.0.1.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\jetty-jaas\9.3.20.v20170531\jetty-jaas-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\websocket\websocket-server\9.3.20.v20170531\websocket-server-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\websocket\websocket-common\9.3.20.v20170531\websocket-common-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\websocket\websocket-api\9.3.20.v20170531\websocket-api-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\websocket\websocket-client\9.3.20.v20170531\websocket-client-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\websocket\websocket-servlet\9.3.20.v20170531\websocket-servlet-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\jetty-jndi\9.3.20.v20170531\jetty-jndi-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\apache-jsp\9.3.20.v20170531\apache-jsp-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\toolchain\jetty-schemas\3.1\jetty-schemas-3.1.jar;C:\Users\sb171\.m2\repository\org\eclipse\jdt\core\compiler\ecj\4.4.2\ecj-4.4.2.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\apache-jstl\9.3.20.v20170531\apache-jstl-9.3.20.v20170531.jar;C:\Users\sb171\.m2\repository\org\apache\taglibs\taglibs-standard-spec\1.2.5\taglibs-standard-spec-1.2.5.jar;C:\Users\sb171\.m2\repository\org\apache\taglibs\taglibs-standard-impl\1.2.5\taglibs-standard-impl-1.2.5.jar;C:\Users\sb171\.m2\repository\org\apache\thrift\libfb303\0.9.3\libfb303-0.9.3.jar;C:\Users\sb171\.m2\repository\org\apache\curator\curator-recipes\2.12.0\curator-recipes-2.12.0.jar;C:\Users\sb171\.m2\repository\org\jamon\jamon-runtime\2.3.1\jamon-runtime-2.3.1.jar;C:\Users\sb171\.m2\repository\org\apache\hive\hive-serde\3.1.2\hive-serde-3.1.2.jar;C:\Users\sb171\.m2\repository\com\google\code\findbugs\jsr305\3.0.0\jsr305-3.0.0.jar;C:\Users\sb171\.m2\repository\org\apache\arrow\arrow-vector\0.8.0\arrow-vector-0.8.0.jar;C:\Users\sb171\.m2\repository\org\apache\arrow\arrow-format\0.8.0\arrow-format-0.8.0.jar;C:\Users\sb171\.m2\repository\org\apache\arrow\arrow-memory\0.8.0\arrow-memory-0.8.0.jar;C:\Users\sb171\.m2\repository\io\netty\netty-buffer\4.1.17.Final\netty-buffer-4.1.17.Final.jar;C:\Users\sb171\.m2\repository\io\netty\netty-common\4.1.17.Final\netty-common-4.1.17.Final.jar;C:\Users\sb171\.m2\repository\com\carrotsearch\hppc\0.7.2\hppc-0.7.2.jar;C:\Users\sb171\.m2\repository\com\vlkan\flatbuffers\1.2.0-3f79e055\flatbuffers-1.2.0-3f79e055.jar;C:\Users\sb171\.m2\repository\org\apache\avro\avro\1.7.7\avro-1.7.7.jar;C:\Users\sb171\.m2\repository\org\codehaus\jackson\jackson-core-asl\1.9.13\jackson-core-asl-1.9.13.jar;C:\Users\sb171\.m2\repository\org\codehaus\jackson\jackson-mapper-asl\1.9.13\jackson-mapper-asl-1.9.13.jar;C:\Users\sb171\.m2\repository\com\thoughtworks\paranamer\paranamer\2.3\paranamer-2.3.jar;C:\Users\sb171\.m2\repository\org\xerial\snappy\snappy-java\1.0.5\snappy-java-1.0.5.jar;C:\Users\sb171\.m2\repository\net\sf\opencsv\opencsv\2.3\opencsv-2.3.jar;C:\Users\sb171\.m2\repository\org\apache\parquet\parquet-hadoop-bundle\1.10.0\parquet-hadoop-bundle-1.10.0.jar;C:\Users\sb171\.m2\repository\org\apache\hive\hive-metastore\3.1.2\hive-metastore-3.1.2.jar;C:\Users\sb171\.m2\repository\org\apache\hive\hive-standalone-metastore\3.1.2\hive-standalone-metastore-3.1.2.jar;C:\Users\sb171\.m2\repository\org\datanucleus\datanucleus-api-jdo\4.2.4\datanucleus-api-jdo-4.2.4.jar;C:\Users\sb171\.m2\repository\org\datanucleus\datanucleus-core\4.1.17\datanucleus-core-4.1.17.jar;C:\Users\sb171\.m2\repository\org\datanucleus\datanucleus-rdbms\4.1.19\datanucleus-rdbms-4.1.19.jar;C:\Users\sb171\.m2\repository\org\datanucleus\javax.jdo\3.2.0-m3\javax.jdo-3.2.0-m3.jar;C:\Users\sb171\.m2\repository\javax\transaction\transaction-api\1.1\transaction-api-1.1.jar;C:\Users\sb171\.m2\repository\sqlline\sqlline\1.3.0\sqlline-1.3.0.jar;C:\Users\sb171\.m2\repository\com\google\guava\guava\19.0\guava-19.0.jar;C:\Users\sb171\.m2\repository\org\apache\hbase\hbase-client\2.0.0-alpha4\hbase-client-2.0.0-alpha4.jar;C:\Users\sb171\.m2\repository\org\apache\hbase\thirdparty\hbase-shaded-protobuf\1.0.1\hbase-shaded-protobuf-1.0.1.jar;C:\Users\sb171\.m2\repository\org\apache\hbase\hbase-protocol-shaded\2.0.0-alpha4\hbase-protocol-shaded-2.0.0-alpha4.jar;C:\Users\sb171\.m2\repository\org\apache\hbase\hbase-protocol\2.0.0-alpha4\hbase-protocol-2.0.0-alpha4.jar;C:\Users\sb171\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\sb171\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\sb171\.m2\repository\commons-io\commons-io\2.5\commons-io-2.5.jar;C:\Users\sb171\.m2\repository\org\apache\hbase\thirdparty\hbase-shaded-miscellaneous\1.0.1\hbase-shaded-miscellaneous-1.0.1.jar;C:\Users\sb171\.m2\repository\org\apache\hbase\thirdparty\hbase-shaded-netty\1.0.1\hbase-shaded-netty-1.0.1.jar;C:\Users\sb171\.m2\repository\org\apache\htrace\htrace-core\3.2.0-incubating\htrace-core-3.2.0-incubating.jar;C:\Users\sb171\.m2\repository\org\jruby\jcodings\jcodings\1.0.18\jcodings-1.0.18.jar;C:\Users\sb171\.m2\repository\org\jruby\joni\joni\2.1.11\joni-2.1.11.jar;C:\Users\sb171\.m2\repository\org\apache\commons\commons-crypto\1.0.0\commons-crypto-1.0.0.jar;C:\Users\sb171\.m2\repository\org\apache\hadoop\hadoop-auth\2.7.1\hadoop-auth-2.7.1.jar;C:\Users\sb171\.m2\repository\org\apache\directory\server\apacheds-kerberos-codec\2.0.0-M15\apacheds-kerberos-codec-2.0.0-M15.jar;C:\Users\sb171\.m2\repository\org\apache\directory\server\apacheds-i18n\2.0.0-M15\apacheds-i18n-2.0.0-M15.jar;C:\Users\sb171\.m2\repository\org\apache\directory\api\api-asn1-api\1.0.0-M20\api-asn1-api-1.0.0-M20.jar;C:\Users\sb171\.m2\repository\org\apache\directory\api\api-util\1.0.0-M20\api-util-1.0.0-M20.jar;C:\Users\sb171\.m2\repository\org\apache\yetus\audience-annotations\0.5.0\audience-annotations-0.5.0.jar;C:\Users\sb171\.m2\repository\com\jolbox\bonecp\0.8.0.RELEASE\bonecp-0.8.0.RELEASE.jar;C:\Users\sb171\.m2\repository\com\zaxxer\HikariCP\2.6.1\HikariCP-2.6.1.jar;C:\Users\sb171\.m2\repository\org\apache\derby\derby\10.14.1.0\derby-10.14.1.0.jar;C:\Users\sb171\.m2\repository\commons-pool\commons-pool\1.5.4\commons-pool-1.5.4.jar;C:\Users\sb171\.m2\repository\commons-dbcp\commons-dbcp\1.4\commons-dbcp-1.4.jar;C:\Users\sb171\.m2\repository\javax\jdo\jdo-api\3.0.1\jdo-api-3.0.1.jar;C:\Users\sb171\.m2\repository\javax\transaction\jta\1.1\jta-1.1.jar;C:\Users\sb171\.m2\repository\org\antlr\antlr-runtime\3.5.2\antlr-runtime-3.5.2.jar;C:\Users\sb171\.m2\repository\co\cask\tephra\tephra-api\0.6.0\tephra-api-0.6.0.jar;C:\Users\sb171\.m2\repository\co\cask\tephra\tephra-core\0.6.0\tephra-core-0.6.0.jar;C:\Users\sb171\.m2\repository\com\google\code\gson\gson\2.2.4\gson-2.2.4.jar;C:\Users\sb171\.m2\repository\com\google\inject\guice\3.0\guice-3.0.jar;C:\Users\sb171\.m2\repository\javax\inject\javax.inject\1\javax.inject-1.jar;C:\Users\sb171\.m2\repository\aopalliance\aopalliance\1.0\aopalliance-1.0.jar;C:\Users\sb171\.m2\repository\com\google\inject\extensions\guice-assistedinject\3.0\guice-assistedinject-3.0.jar;C:\Users\sb171\.m2\repository\it\unimi\dsi\fastutil\6.5.6\fastutil-6.5.6.jar;C:\Users\sb171\.m2\repository\org\apache\twill\twill-common\0.6.0-incubating\twill-common-0.6.0-incubating.jar;C:\Users\sb171\.m2\repository\org\apache\twill\twill-core\0.6.0-incubating\twill-core-0.6.0-incubating.jar;C:\Users\sb171\.m2\repository\org\apache\twill\twill-api\0.6.0-incubating\twill-api-0.6.0-incubating.jar;C:\Users\sb171\.m2\repository\org\apache\twill\twill-discovery-api\0.6.0-incubating\twill-discovery-api-0.6.0-incubating.jar;C:\Users\sb171\.m2\repository\org\apache\twill\twill-discovery-core\0.6.0-incubating\twill-discovery-core-0.6.0-incubating.jar;C:\Users\sb171\.m2\repository\org\apache\twill\twill-zookeeper\0.6.0-incubating\twill-zookeeper-0.6.0-incubating.jar;C:\Users\sb171\.m2\repository\co\cask\tephra\tephra-hbase-compat-1.0\0.6.0\tephra-hbase-compat-1.0-0.6.0.jar;C:\Users\sb171\.m2\repository\org\apache\hive\hive-shims\3.1.2\hive-shims-3.1.2.jar;C:\Users\sb171\.m2\repository\org\apache\hive\shims\hive-shims-common\3.1.2\hive-shims-common-3.1.2.jar;C:\Users\sb171\.m2\repository\org\apache\hive\shims\hive-shims-0.23\3.1.2\hive-shims-0.23-3.1.2.jar;C:\Users\sb171\.m2\repository\org\apache\hadoop\hadoop-yarn-server-resourcemanager\3.1.0\hadoop-yarn-server-resourcemanager-3.1.0.jar;C:\Users\sb171\.m2\repository\com\google\inject\extensions\guice-servlet\4.0\guice-servlet-4.0.jar;C:\Users\sb171\.m2\repository\com\sun\jersey\contribs\jersey-guice\1.19\jersey-guice-1.19.jar;C:\Users\sb171\.m2\repository\com\sun\jersey\jersey-servlet\1.19\jersey-servlet-1.19.jar;C:\Users\sb171\.m2\repository\org\apache\hadoop\hadoop-yarn-common\3.1.0\hadoop-yarn-common-3.1.0.jar;C:\Users\sb171\.m2\repository\com\fasterxml\jackson\module\jackson-module-jaxb-annotations\2.7.8\jackson-module-jaxb-annotations-2.7.8.jar;C:\Users\sb171\.m2\repository\com\fasterxml\jackson\jaxrs\jackson-jaxrs-json-provider\2.7.8\jackson-jaxrs-json-provider-2.7.8.jar;C:\Users\sb171\.m2\repository\com\fasterxml\jackson\jaxrs\jackson-jaxrs-base\2.7.8\jackson-jaxrs-base-2.7.8.jar;C:\Users\sb171\.m2\repository\org\apache\hadoop\hadoop-yarn-api\3.1.0\hadoop-yarn-api-3.1.0.jar;C:\Users\sb171\.m2\repository\com\sun\jersey\jersey-client\1.19\jersey-client-1.19.jar;C:\Users\sb171\.m2\repository\org\eclipse\jetty\jetty-util-ajax\9.3.19.v20170502\jetty-util-ajax-9.3.19.v20170502.jar;C:\Users\sb171\.m2\repository\org\apache\hadoop\hadoop-yarn-server-common\3.1.0\hadoop-yarn-server-common-3.1.0.jar;C:\Users\sb171\.m2\repository\org\apache\hadoop\hadoop-yarn-registry\3.1.0\hadoop-yarn-registry-3.1.0.jar;C:\Users\sb171\.m2\repository\commons-daemon\commons-daemon\1.0.13\commons-daemon-1.0.13.jar;C:\Users\sb171\.m2\repository\dnsjava\dnsjava\2.1.7\dnsjava-2.1.7.jar;C:\Users\sb171\.m2\repository\org\apache\geronimo\specs\geronimo-jcache_1.0_spec\1.0-alpha-1\geronimo-jcache_1.0_spec-1.0-alpha-1.jar;C:\Users\sb171\.m2\repository\org\ehcache\ehcache\3.3.1\ehcache-3.3.1.jar;C:\Users\sb171\.m2\repository\com\zaxxer\HikariCP-java7\2.4.12\HikariCP-java7-2.4.12.jar;C:\Users\sb171\.m2\repository\com\microsoft\sqlserver\mssql-jdbc\6.2.1.jre7\mssql-jdbc-6.2.1.jre7.jar;C:\Users\sb171\.m2\repository\org\apache\hadoop\hadoop-yarn-server-applicationhistoryservice\3.1.0\hadoop-yarn-server-applicationhistoryservice-3.1.0.jar;C:\Users\sb171\.m2\repository\de\ruedigermoeller\fst\2.50\fst-2.50.jar;C:\Users\sb171\.m2\repository\com\cedarsoftware\java-util\1.9.0\java-util-1.9.0.jar;C:\Users\sb171\.m2\repository\com\cedarsoftware\json-io\2.5.1\json-io-2.5.1.jar;C:\Users\sb171\.m2\repository\org\apache\hadoop\hadoop-yarn-server-web-proxy\3.1.0\hadoop-yarn-server-web-proxy-3.1.0.jar;C:\Users\sb171\.m2\repository\org\fusesource\leveldbjni\leveldbjni-all\1.8\leveldbjni-all-1.8.jar;C:\Users\sb171\.m2\repository\org\apache\hive\shims\hive-shims-scheduler\3.1.2\hive-shims-scheduler-3.1.2.jar;C:\Users\sb171\.m2\repository\org\apache\hive\hive-service-rpc\3.1.2\hive-service-rpc-3.1.2.jar;C:\Users\sb171\.m2\repository\org\apache\httpcomponents\httpclient\4.5.2\httpclient-4.5.2.jar;C:\Users\sb171\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\Users\sb171\.m2\repository\org\apache\httpcomponents\httpcore\4.4.4\httpcore-4.4.4.jar;C:\Users\sb171\.m2\repository\org\apache\thrift\libthrift\0.9.3\libthrift-0.9.3.jar;C:\Users\sb171\.m2\repository\org\apache\zookeeper\zookeeper\3.4.6\zookeeper-3.4.6.jar;C:\Users\sb171\.m2\repository\org\slf4j\slf4j-log4j12\1.6.1\slf4j-log4j12-1.6.1.jar;C:\Users\sb171\.m2\repository\log4j\log4j\1.2.16\log4j-1.2.16.jar;C:\Users\sb171\.m2\repository\io\netty\netty\3.7.0.Final\netty-3.7.0.Final.jar;C:\Users\sb171\.m2\repository\org\apache\curator\curator-framework\2.12.0\curator-framework-2.12.0.jar;C:\Users\sb171\.m2\repository\org\apache\curator\curator-client\2.12.0\curator-client-2.12.0.jar;C:\Users\sb171\.m2\repository\org\slf4j\slf4j-api\1.7.10\slf4j-api-1.7.10.jar;C:\Users\sb171\.m2\repository\org\apache\hive\hive-upgrade-acid\3.1.2\hive-upgrade-acid-3.1.2.jar;C:\Users\sb171\.m2\repository\mysql\mysql-connector-java\8.0.30\mysql-connector-java-8.0.30.jar;C:\Users\sb171\.m2\repository\com\google\protobuf\protobuf-java\3.19.4\protobuf-java-3.19.4.jar com.edu.test.Task1 Person{day_time='null', total_msg_cnt=3735} +-----------------------------------+ {TASK1-HIVE}运行完成.. +-----------------------------------+ 发现空值:Person{day_time='null', total_msg_cnt=3735} Exception in thread "main" java.sql.BatchUpdateException: Column 'day_time' cannot be null at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at com.mysql.cj.util.Util.handleNewInstance(Util.java:192) at com.mysql.cj.util.Util.getInstance(Util.java:167) at com.mysql.cj.util.Util.getInstance(Util.java:174) at com.mysql.cj.jdbc.exceptions.SQLError.createBatchUpdateException(SQLError.java:224) at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchSerially(ClientPreparedStatement.java:816) at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchInternal(ClientPreparedStatement.java:418) at com.mysql.cj.jdbc.StatementImpl.executeBatch(StatementImpl.java:795) at com.edu.test.Task1.writeToMYSQL(Task1.java:83) at com.edu.test.Task1.main(Task1.java:67) Caused by: java.sql.SQLIntegrityConstraintViolationException: Column 'day_time' cannot be null at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:117) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916) at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1061) at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchSerially(ClientPreparedStatement.java:795) ... 4 more Process finished with exit code 1
06-30
### 原因分析 在将 Hive 表数据导入 MySQL 的过程中出现 `Column 'day_time' cannot be null` 错误,说明目标表的 `day_time` 字段被定义为 `NOT NULL`,但在插入的数据中存在该字段为 `NULL` 的记录。Hive 表可能允许 `day_time` 为 `NULL`,或者在读取时未能正确处理空值字段,导致向 MySQL 插入非法数据 [^1]。 --- ### 解决方案 #### 1. 检查 Hive 数据源中的 `day_time` 字段 首先应确认 Hive 表中是否存在 `day_time` 为空的情况,可以通过以下 SQL 查询验证: ```sql SELECT * FROM hive_table WHERE day_time IS NULL; ``` 若查询结果不为空,则说明源数据中确实存在空值,需要进行清洗或处理后再导入 MySQL [^2]。 --- #### 2. 修改 MySQL 表结构允许 `day_time` 为 `NULL` 如果业务逻辑允许 `day_time` 为空,可修改目标 MySQL 表结构,使其支持 `NULL` 值: ```sql ALTER TABLE total_msg_cnt MODIFY COLUMN day_time VARCHAR(255) NULL; ``` 此操作将允许 `day_time` 字段接受 `NULL` 值,避免插入失败 [^3]。 --- #### 3.Java 程序中过滤或替换空值 可以在程序中对读取到的 Hive 数据进行校验和预处理,例如在 `packPerson` 方法中添加判断逻辑: ```java static Person packPerson(ResultSet rs) throws SQLException { Person p = new Person(); String day_time = rs.getString(1); Long total_msg_cnt = rs.getLong(2); if (day_time == null || day_time.isEmpty()) { day_time = "UNKNOWN"; // 或者设置默认值 } p.setDay_time(day_time); p.setTotal_msg_cnt(total_msg_cnt); return p; } ``` 通过这种方式确保写入 MySQL 的数据中 `day_time` 不为 `NULL` [^4]。 --- #### 4. 使用 Hive SQL 预处理数据 在读取 Hive 数据时,可以使用 `COALESCE` 函数替代空值: ```sql SELECT COALESCE(CAST(day_time AS STRING), 'UNKNOWN') AS day_time, total_msg_cnt FROM hive_table; ``` 这样即使源数据中存在空值,在导入 MySQL 时也不会违反非空约束 [^5]。 --- ### 示例代码:增强后的 `getHiveData` 方法 ```java static List<Person> getHiveData() throws SQLException { Connection conn = HiveUtils.getConnection(); String SQL = "SELECT COALESCE(CAST(day_time AS STRING), 'UNKNOWN') AS day_time, total_msg_cnt FROM hive_table;"; PreparedStatement psmt = conn.prepareStatement(SQL); ResultSet rs = psmt.executeQuery(); List<Person> list = new ArrayList<>(); while (rs.next()) { Person p = packPerson(rs); list.add(p); System.out.println(p); } rs.close(); psmt.close(); HiveUtils.closeConnection(); System.out.println("+-----------------------------------+"); System.out.println("{TASK1-HIVE}运行完成.."); System.out.println("+-----------------------------------+"); return list; } ``` --- ### 注意事项 - 在实际生产环境中,建议在数据迁移前对源数据进行质量检查,确保字段完整性。 - 若 `day_time` 是时间戳类型,应考虑是否使用默认值(如当前时间)或特殊标记(如 `'1970-01-01'`)代替 `NULL` [^6]。 - 对于大规模数据迁移任务,推荐使用 ETL 工具(如 Sqoop、Apache NiFi)进行数据清洗和转换。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值