本文提供一种用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 )

最新文章

  1. css3圆环百分比,菜单栏定位导航
  2. Android—ZXing二维码扫描遇到的问题
  3. python入门到精通[三]:基础学习(2)
  4. 关于 Redis 访问安全性的问题
  5. Outlook 2013 在邮件里面点击超链接时弹出&ldquo;组织策略阻止我们为您完成此操作&rdquo;
  6. css背景图片拉伸 以及100% 满屏显示
  7. linux系统装windows时需要注意的问题
  8. 中间人攻击之arp欺骗 科普ARP欺骗
  9. poi读写Excel文件
  10. [转载自 文顶顶]iOS开发UI篇—程序启动原理和UIApplication
  11. Socket编程模式
  12. 前端angularjs+requirejs+dhtmlx 后端asp.net webapi
  13. 【百度地图API】建立全国银行位置查询系统(四)——如何利用百度地图的数据生成自己的标注
  14. POJ 2418 Hardwood Species (哈希,%f 和 %lf)
  15. 求两个字符串最大的子字符串C#
  16. 【转载】从头编写 asp.net core 2.0 web api 基础框架 (5) EF CRUD
  17. 简单的cookie读写封装
  18. 以太坊智能合约虚拟机(EVM)原理与实现
  19. Android组件化探索与实践
  20. Django学习笔记(3)--模板

热门文章

  1. ubuntu解压zip文件出现乱码情况解决方法
  2. xfce 设在分辨率1920 1080
  3. 【3】数据筛选3 - BeautifulSoup4
  4. python正则表达式提取字符串
  5. 部署live555到云
  6. 《编译原理》构造 LL(1) 分析表的步骤 - 例题解析
  7. 【03】WAMPServer集成环境下载和安装
  8. Eclipse 导出的jar包 , 使用后提示重复定义?
  9. 控制公司(codevs 2051)
  10. I - Navigation Nightmare 并查集