Hive解析json数据
我们平时在使用关系数据库存储数据时,在某种情况下可能会有使用字符串类的字段来存储json格式的数据,然后在代码里面进行解析处理等,这样比较方便扩展,但是在使用数据进行分析等场景下就会很不方便,这时候就需要对json进行一些解析的操作,这次主要看下如何使用Hive来解析json格式的数据 get_json_object Hive为我们提供了get_json_object函数,可以指定路径来获取json字符串中的属性值,如 12345678910111213-- 处理对象select get_json_object('{"name":"zhangsan", "age":10}', '$.name')-- 输出: zhangsan-- 如果需要获取对象中的多个数据,可以使用json_tupleselect json_tuple('{"name":"zhangsan", "age":10&...
Java对象比对实现
有时候我们需要对于同一个类的两个实例对象进行一下数据内容的比对,找出他们的差异,比如用来做单测或者同一份数据多版本的内容比对,这里主要介绍使用apache的commons-lang3的工具类来进行功能实现 首先需要引入如下包依赖 12345<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version></dependency> 使用时需要实现Diffable接口,并使用DiffBuilder来构建比对结果 1234567891011121314public class Person implements Diffable<Person> { String name; int age; boolean smoker; public DiffResult di...
JSONPath简介
JSON目前是使用的比较多的一种数据格式,前后端的交互就是都是使用JSON格式,后端存储的时候就算使用MySQL,有时候也会存在使用字符串等类型字段存储JSON数据(现在MySQL也支持了JSON类型字段并提供相关的语法) JSONPath比较适合使用在一些结构不确定,或者比较灵活的场景下,从json中获取想要的数据 有一些变更频繁的扩展类的非核心数据,可以直接当做一个json字符串进行存储,在获取的数据可以通过配置的JsonPath来从其中进行取值使用 在做类似网关等场景下,可以通过配置JsonPath完成数据的转换,当然如果转换逻辑特别复杂时可能还是模版引擎更合适一些 使用 我们先看下JSONPath的使用,这里使用的是https://github.com/json-path/JsonPath,其README中已经提供了相关的介绍和使用示例,这里再简单介绍下,我们这里直接使用其中的示例数据 12345678910111213141516171819202122232425262728293031323334353637{ "store":...
MyBatis(二)原理及简化工具介绍
之前写过一篇mybatis-spring配置及使用的文章,但是其中主要是偏使用的一些内容,这次我们就从根上来分析一下 mybatis配置及核心流程的功能实现,以及后续对它配置的一些优化、简化功能 mybatis为基于3.5.10版本的代码 最简核心配置 配置使用 首先需要进行mybatis的xml配置 mybatis-config.xml 123456789101112131415161718192021222324<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <environments default="develop...
分布式任务调度核心流程(xxl-job)
之前简单分析过定时任务的几种实现,但是都是单机本地的实现,现在看一下分布式的任务调度,开源的xxl-job的实现,因为其中的内容较多,这次我们就只看一下其中的任务调度部分,没有关注其中的一些分支逻辑,虽然也很重要 xxl-job的整体执行流程如下图所示 其中主要分为调度器和执行器,调度器用来根据配置信息,在特定的条件下调用执行器中的对应任务进行任务的执行 执行器配置 可以看一下xxl-job提供的spring boot为例的执行器,其中需要配置执行器的名称等信息 123456789# 设置调度中心的地址(执行时会有一些接口相关的调用交互)xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin### 执行器的名称 AppNamexxl.job.executor.appname=xxl-job-executor-sample### 可选,默认是自己当前的地址xxl.job.executor.address=### 执行器使用的IP和端口xxl.job.executor.ip=xxl.job.executor.port...
Clojure学习文档
本文主要对Clojure官网中的基础教程部分进行一下整理,对应地址https://clojure.org/guides/learn/syntax 函数 创建函数 定义一个函数,名称为 greet, 参数为name 1234(defn greet [name] (str "Hello, " name));; 或者使用如下方式(def greet (fn [name] (str "Hello, " name))) 使用 12user=> (greet "students")"Hello, students" 函数重载 12345678910(defn messenger ([] (messenger "Hello world!")) ([msg] (println msg)));; 使用user=> (messenger)Hello world!user => (messenger "Hello class!")Hello class! 可变...
SpEL使用
Spring Expression Language(SpEL) 是一个表达式语言,可以用来在运行时查询和操作对象图,比较类似于EL表达式,相比其他的表达式语言,可以更好的与Spring集成,如果使用Spring的话,也可以不用再引入额外的依赖 同时它也是可以单独引入并且使用的,这里我们主要就是看一下单独使用的情况下它能做什么以及如何使用 首先需要引入依赖包 12345<dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>5.3.12</version></dependency> 普通表达式求值 123456789101112ExpressionParser parser = new SpelExpressionParser();String helloWorld = parser.parseExpression(...
Spring循环依赖分析
我们在使用Spring开发的时候,可能有的时候不小心就会写出来循环依赖,但是大部分情况下都能正常运行,不需要我们特别关注,这是因为Spring进行了相关的处理等 循环依赖的处理还依赖于bean的作用范围,bean的注入方式等,这里我们就以单例模式,属性注入的方式来分析一下Spring对于循环依赖的处理 我们以如下场景为例来进行分析,有ServiceA和ServiceB两个Bean, 它们互相依赖 1234567891011@Servicepublic class ServiceA { @Resource private ServiceB serviceB;}@Servicepublic class ServiceB { @Resource private ServiceA serviceA;} 先说结论,然后再进行操作和分析,spring的创建过程大致如下 处理循环依赖的关键就是其中的注册单例Bean工厂(singletonFactories)相关功能 首次获取ServiceA这个bean时,单例工厂中不存在,...
PF4J入门使用
写代码我们都知道要抽象,要封装变化,要实现开闭原则,比如对于很多相似的功能,我们可以将通用的功能抽象出来,然后把变化的不同的地方提取出去,比如模版模式、策略模式等都是实现类似的效果 比如对于策略模式,我们通常是定义一个接口,然后有不同的实现,这种是可以的,但是如果通用流程中要扩展的点较多的话,这些不同的实现也需要管理,可以把他们合并到一个单独的包中,再进一步,我们甚至可以将包单独提取出来,支持运行时加载包实现新增功能的支持 JDK对此功能的支持就是 SPI,但是它的限制较多,也不够灵活,比如dubbo就是自己定义了一套SPI的实现,这次我们来看另一个实现,pf4j 提供一套在基本框架中定义扩展点接口,然后通过不同的插件来实现扩展点的功能,来支持对新增开放对修改关闭 这次我们就来学习一下它的使用 使用 比如我们有一套通用的流程,假设是下单流程,不同的业务线等对于下单都有一些特殊点,但是它们的基本流程是相似的,这时候我们就可以先定义好通用的流程,不同的地方预留出扩展点接口,使用 pf4j 的流程如下 先定义好扩展点接口(需要定义单独的包,因为基本应用和各个扩展点的包都依赖它) 定...
Thrift(三)-协议使用
Thrift的关键其实就是在定义好结构后,通过某种序列化方式进行网络传输交互,一般定义结构可以使用IDL的方式来描述各个字段属性等信息,这种方式可以支持跨语言的使用。对于纯Java的应用,也可以通过在类中添加注解的方式来实现,即把IDL中需要定义的信息,通过注解和注解中的信息来进行描述,同样可以达到定义结构的目的 定义好结构之后,就可以通过对应的TProtocol将数据结构进行发送和接收的序列化和反序列化即可,这次我们主要看下TProtocol中的一个实现–TBinaryProtocol 之前我们也看过thrift支持的一些结构类型,如struct、string、map、list等,具体可以看下对应枚举 12345678910111213141516public final class TType { public static final byte STOP = 0; public static final byte VOID = 1; public static final byte BOOL = 2; public stat...
