根据JSON创建对应的HIVE表
本文提供一种用SCALA把JSON串转换为HIVE表的方法,由于比较简单,只贴代码,不做解释。有问题可以留言探讨
package com.gabry.hive
import org.json4s._
import org.json4s.native.JsonMethods._
import scala.io.Source
class Json2Hive{
/**
* sealed abstract class JValue
*case object JNothing extends JValue // 'zero' for JValue
*case object JNull extends JValue
*case class JString(s: String) extends JValue
*case class JDouble(num: Double) extends JValue
*case class JDecimal(num: BigDecimal) extends JValue
*case class JInt(num: BigInt) extends JValue
*case class JBool(value: Boolean) extends JValue
*case class JObject(obj: List[JField]) extends JValue
*case class JArray(arr: List[JValue]) extends JValue
*type JField = (String, JValue)
*create table student_test(id INT, info struct< name:string,age:INT >)
*jsonString:{ "people_type":1,"people":{"person_id": 5,"test_count": 5,"para":{"name":"jack","age":6}}}
*/ private def fieldDelimiter(level:Int) = if ( level == 2 ) " " else ":"
private def decodeJson(jv: Any,level:Int,hql:StringBuilder) :Unit = {
jv match {
case js:JString => hql.append(fieldDelimiter(level)+"string,")
case jdo:JDouble => hql.append(fieldDelimiter(level)+"double,")
case jde:JDecimal => hql.append(fieldDelimiter(level)+"decimal,")
case ji:JInt => hql.append(fieldDelimiter(level)+"bigint,")
case jb:JBool => hql.append(fieldDelimiter(level)+"int,")
case jf:JField=>
hql.append(jf._1)
decodeJson(jf._2,level+1,hql)
case ja:JArray=>
hql.append(level + " struct<")
ja.arr.foreach(decodeJson(_,level+1,hql))
hql.append(">")
case jo:JObject=>
if (level !=0) hql.append(" struct<")
jo.obj.foreach(decodeJson(_,level+1,hql))
if ( hql.endsWith(",") ) hql.deleteCharAt(hql.length-1)
if (level !=0) hql.append(">,")
case JNull=> hql.append(fieldDelimiter(level)+"string,")
case _ =>println(jv)
}
}
def toHive(jsonStr:String,tableName:String):String = {
val jsonObj = parse(jsonStr)
val hql = new StringBuilder()
decodeJson(jsonObj,0,hql)
"create table %s ( %s )".format(tableName,hql.toString())
}
}
object Json2Hive{
val json2hive = new Json2Hive()
def main (args :Array[String]) : Unit = {
if ( args.length != 2 ) println("usage : json2hive jsonFile hiveTableName")
val jsonFile = args(0)
val hiveTableName = args(1)
//val jsonstr ="{ \"people_type\":0,\"people_num\":0.1,\"people\":{\"person_id\": 5,\"test_count\": 5,\"para\":{\"name\":\"jack\",\"age\":6}},\"gender\":1}"
//val jsonstr ="{ \"people_type\":0,\"object\":{\"f1\":1,\"f2\":1},\"gender\":1}"
/* 由于JSON串不容易用参数传递,故此处以json文件代替 */
val file = Source.fromFile(jsonFile,"UTF-8")
/* 将文件中的json串转换为对应的HIVE表 */
file.getLines().foreach(line=>println(json2hive.toHive(line.toString,hiveTableName)))
file.close()
}
}
以下是测试结果
create table example ( people_type bigint,people_num double,people struct<person_id:bigint,test_count:bigint,para struct<name:string,age:bigint>>,gender bigint )
根据JSON创建对应的HIVE表的更多相关文章
- 创建function实现hive表结果导出到mysql
1. 创建临时function (这里两个包都是hive自带的,不需要自己开发的,可以根据名称查找对应的版本) add jar /opt/local/hive/lib/hive-contrib-.ja ...
- flume的sink写入hive表
flume的配置文件如下: a1.sources=r1 a1.channels=c1 a1.sinks=s1 a1.sources.r1.type=netcat a1.sources.r1.bind= ...
- hive中创建hive-json格式的表及查询
在hive中对于json的数据格式,可以使用get_json_object或json_tuple先解析然后查询. 也可以直接在hive中创建json格式的表结构,这样就可以直接查询,实战如下(hive ...
- 【原】创建Hive表,分号分隔符“;”引起的异常
[障碍再现] 在创建支持Map数据结构的Hive表时,抛出如下异常 hive> create table tab_map(name string,info map<string,strin ...
- 批量导入数据到hive表中:假设我有60张主子表如何批量创建导入数据
背景:根据业务需要需要把60张主子表批量入库到hive表. 创建测试数据: def createBatchTestFile(): Unit = { to ) { val sWriter = new P ...
- Hive表中Partition的创建
作用: 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,在对应的partition里面去查找就可以,减少查询时间. 1. 创建表 ...
- hive 将hive表数据查询出来转为json对象和json数组输出
一.将hive表数据查询出来转为json对象输出 1.将查询出来的数据转为一行一行,并指定分割符的数据 2.使用UDF函数,将每一行数据作为string传入UDF函数中转换为json再返回 1.准备数 ...
- [Hive]使用HDFS文件夹数据创建Hive表分区
描写叙述: Hive表pms.cross_sale_path建立以日期作为分区,将hdfs文件夹/user/pms/workspace/ouyangyewei/testUsertrack/job1Ou ...
- 用puthivestreaming把hdfs里的数据流到hive表
全景图: 1. 创建hive表 CREATE TABLE IF NOT EXISTS newsinfo.test( name STRING ) CLUSTERED BY (name)INTO 3 ...
随机推荐
- 配置Struts2后运行jsp出现404的解决方法
更新:善用控制台查看错误信息 --------------------------------------------- 原因:Java Build Path没有导入正确的jar包或者导入了但没有把相 ...
- SSM+Shiro
1) 表名:用户表(Sys_Users) Salt:盐(佐料).为避免被黑客等进行攻击(暴力密码破解),所以一般在注册用户信息时,系统会随机生成一个随机码.在验证时会将密码和随机码进行运算,以验证密码 ...
- 【Codeforces 1102E】Monotonic Renumeration
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 会发现如果a[i]=a[j] 那么b[i]~b[j]都是相同的,等于b[i] 而b[i]等于b[i-1]+1或者b[i] 有两种可能 所以对于 ...
- poj 3923 模拟
/* 1.判断是否是一个完整边框 2.判断是否长度和宽度小于3 3.判断是否有内部覆盖的现象 */ #include<stdio.h> #define N 110 #define inf ...
- 爬虫——使用ItemLoader维护item
在item的Filed()中设置参数函数,可以用来预处理item字段的数据,另一方面也方便程序代码的管理和重用 item中 from scrapy.loader.processors import M ...
- 分块试水--CODEVS5037 线段树练习4加强版
感觉这才算入门题吧..前面那些线段树练习,改几个字符就过了一定要搞成几道题.. n<=2e5的数列,给常数K<=2e5,m<=2e5个操作,区间加,问一个区间里K的倍数. 这题空间? ...
- ssh整合配置文件------web.xml配置
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://w ...
- nodejs 运行
运行 Node.js 程序的基本方法就是执行 node script.js,其中 script.js①是脚本的文件名. 除了直接运行脚本文件外,node --help 显示的使用方法中说明了另一种输出 ...
- Codeforces Round #327 (Div. 2)C. Median Smoothing 构造
C. Median Smoothing A schoolboy named Vasya loves reading books on programming and mathematics. He ...
- _io.TextIOWrapper
''' SELECT * FROM Info_Roles WHERE Flag=1 LIMIT 2; select top y * from 表 where 主键 not in(select top ...