本文提供一种用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表的更多相关文章

  1. 创建function实现hive表结果导出到mysql

    1. 创建临时function (这里两个包都是hive自带的,不需要自己开发的,可以根据名称查找对应的版本) add jar /opt/local/hive/lib/hive-contrib-.ja ...

  2. flume的sink写入hive表

    flume的配置文件如下: a1.sources=r1 a1.channels=c1 a1.sinks=s1 a1.sources.r1.type=netcat a1.sources.r1.bind= ...

  3. hive中创建hive-json格式的表及查询

    在hive中对于json的数据格式,可以使用get_json_object或json_tuple先解析然后查询. 也可以直接在hive中创建json格式的表结构,这样就可以直接查询,实战如下(hive ...

  4. 【原】创建Hive表,分号分隔符“;”引起的异常

    [障碍再现] 在创建支持Map数据结构的Hive表时,抛出如下异常 hive> create table tab_map(name string,info map<string,strin ...

  5. 批量导入数据到hive表中:假设我有60张主子表如何批量创建导入数据

    背景:根据业务需要需要把60张主子表批量入库到hive表. 创建测试数据: def createBatchTestFile(): Unit = { to ) { val sWriter = new P ...

  6. Hive表中Partition的创建

    作用: 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,在对应的partition里面去查找就可以,减少查询时间. 1. 创建表 ...

  7. hive 将hive表数据查询出来转为json对象和json数组输出

    一.将hive表数据查询出来转为json对象输出 1.将查询出来的数据转为一行一行,并指定分割符的数据 2.使用UDF函数,将每一行数据作为string传入UDF函数中转换为json再返回 1.准备数 ...

  8. [Hive]使用HDFS文件夹数据创建Hive表分区

    描写叙述: Hive表pms.cross_sale_path建立以日期作为分区,将hdfs文件夹/user/pms/workspace/ouyangyewei/testUsertrack/job1Ou ...

  9. 用puthivestreaming把hdfs里的数据流到hive表

    全景图:   1. 创建hive表 CREATE TABLE IF NOT EXISTS newsinfo.test( name STRING ) CLUSTERED BY (name)INTO 3 ...

随机推荐

  1. Python爬虫常用库安装

    建议更换pip源到国内镜像,下载会快很多:https://www.cnblogs.com/believepd/p/10499844.html requests pip3 install request ...

  2. Linux命令介绍

    资料链接:(Linux基本命令介绍)http://note.youdao.com/share/?id=36c07917f8d3e6437c1e764c3516a3f2&type=note#/ ...

  3. 1.Zigbee开发学习资源

    http://blog.csdn.net/zhanglianpin/article/details/46907349

  4. nginx+keepalived+consul 实现高可用集群

    继 负载均衡 之 nginx+consul+consul template,我这次将使用2台虚拟机,来做一个简单的双机负载均衡试验. 试验目标: 1. 当参加负载均衡的子节点服务,有任何其中一个或多个 ...

  5. 使用NamedParameterJdbcTemplate

    [在JDBC模板中使用具名参数] 1.在经典的JDBC用法中,SQL参数使用占位符?表示,并且受到位置的限制.定为参数的问题在于,一旦参数的顺序发生变化,就必须改变参数绑定. 2.在Spring JD ...

  6. 【03】AngularJS 简介

    AngularJS 简介 AngularJS 是一个 JavaScript 框架.它可通过 <script> 标签添加到 HTML 页面. AngularJS 通过 指令 扩展了 HTML ...

  7. LightOJ 1348 Aladdin and the Return Journey

    Aladdin and the Return Journey Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged ...

  8. Leetcode 95.不同的二叉搜索树II

    不同的二叉搜索树2 给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null ...

  9. Python学习笔记 (2.2)Python中的字符编码问题及标准数据类型之String(字符串)

    Python3中的String类型 首先,Python中没有字符类型,只有字符串类型.单个字符按照长度为1的字符串处理,这对于曾是OIER的我来说有点不适应啊. 字符串的表示方法 最常用的就是用一对双 ...

  10. 网线切割&切绳子

    题目描述 Wonderland居民决定举行一届地区性程序设计大赛.仲裁委员会志愿负责这次赛事并且保证会组织一次有史以来最公正的比赛.为此,所有参赛者的电脑和网络中心会以星状网络连接,也就是说,对每个参 ...