spark StructType的应用,用在处理mongoDB keyvalue
近期在处理mongoDB 数据的时候,遇到了非常奇怪的格式,账号密码的日志都追加在一条记录里面,要取一个密码的时长和所有密码的平均时长就非常繁琐。

用了各种迭代计算,非常困难,而且printschema出来结构也是不规范的。
和同事一起研究后用了StructType 效率非常高。
代码如下:
import java.sql.{DriverManager, ResultSet}
import mongoDb_foundation_data20180913.url
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.types._
import org.apache.spark.sql.SparkSession
object devicests_20180916 {
// spark-submit --driver-class-path /usr/local/jdk/lib/mysql-connector-java-5.1.46.jar --class "devicests_20180916" /testdata/u3.jar
val url = "jdbc:mysql://192.168.1.10:3306/saas?user=saas&password=saas2018"
//val url = "jdbc:mysql://134.175.180.116:3306/saas?user=saas&password=saas2018"
val conn = DriverManager.getConnection(url)
def main(args: Array[String]): Unit = {
val conn = DriverManager.getConnection(url)
val conf = new SparkConf().setAppName("appName").setMaster("local")
val sc = new SparkContext(conf)
val spark = SparkSession.builder().appName("Spark SQL basic example").config("spark.debug.maxToStringFields", "200").getOrCreate()
spark.sql("use saas")
import spark.implicits._
import org.apache.spark.sql.types._
import org.apache.spark.sql.SparkSession
val statement = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE)
// val logData=spark.read.textFile("file:////mysqldata/aasdata/2018-08-17/devices_2018-08-17")
// val log = spark.read.json(logData)
val prop = new java.util.Properties
//
// log.createOrReplaceTempView("devicests_states")
//
//
// // df.write.mode("append").jdbc(url, "saas.devicests_states", prop)
//import org.apache.calcite.adapter
val schema = new StructType()
.add("__v", StringType)
.add("_id", new StructType()
.add("$oid", StringType))
.add("device_type", StringType)
.add("hardware_info", new StructType()
.add("cid", StringType)
.add("mac", StringType)
.add("sn", StringType)
.add("versions", new StructType()
.add("app_version", StringType)
.add("hardware_version", StringType)
.add("zigbee_version", StringType)))
.add("model_id", StringType)
.add("name", StringType)
.add("nickname", StringType)
.add("parent", StringType)
.add("services", ArrayType(StringType))
.add("states", new StructType()
.add("onoff_line", StringType)
.add("passwords",
// spark 默认将 passwords 视为 struct,不便于使用 explode 和 map_values
// 需要手动定义为 Map[String, Struct]
MapType(StringType, new StructType()
.add("description", StringType)
.add("id", StringType)
.add("is_default", StringType)
.add("name", StringType)
.add("permission", new StructType()
.add("begin", StringType)
.add("end", StringType)
.add("status", StringType))
.add("status", IntegerType)
.add("time", StringType)))
.add("power", StringType))
.add("status", IntegerType)
.add("time", StringType)
.add("uuid", StringType)
spark.read.schema(schema)
.json(s"file:///mysqldata/aasdata/2018-09-12/devices_2018-09-12")
.createOrReplaceTempView("devices")
val res = spark.sql(
"""
|SELECT uuid,
| COUNT(passwords.permission) AS count,
| AVG(passwords.permission.end - passwords.permission.begin) AS avg
|FROM
| (
| SELECT uuid,explode(map_values(states.passwords)) AS passwords
| FROM devices
| )
|WHERE
| passwords.permission.begin IS NOT NULL
| AND passwords.permission.end IS NOT NULL group by uuid""".stripMargin)//.collect.head
res.write.mode("overwrite").jdbc(url, "saas.res_count_avg", prop)
////
//// val count = Long(res(0))
//// val avg = Double(res(1))
}
}
spark StructType的应用,用在处理mongoDB keyvalue的更多相关文章
- Spark常用算子-KeyValue数据类型的算子
package com.test; import java.util.ArrayList; import java.util.List; import java.util.Map; import or ...
- 上万字详解Spark Core(建议收藏)
先来一个问题,也是面试中常问的: Spark为什么会流行? 原因1:优秀的数据模型和丰富计算抽象 Spark 产生之前,已经有MapReduce这类非常成熟的计算系统存在了,并提供了高层次的API(m ...
- MongoSpark 28799错误
Exception : . The full response is { , "codeName" : "Location28799" } at com.mon ...
- mongo-spark 安装排故 ./sbt check
[error] at com.mongodb.connection.CommandProtocol.execute(CommandProtocol.java:) [error] at com.mong ...
- 大数据才是未来,Oracle、SQL Server成昨日黄花?
1. 引子**** 有人在某个专注SQL的公众号留言如下: 这个留言触碰到一个非常敏感的问题:搞关系型数据库还有前途吗?现在都2020年了,区块链正火热,AI人才已经"过剩",大数 ...
- Storm 流式计算框架
1. 简介 是一个分布式, 高容错的 实时计算框架 Storm进程常驻内存, 永久运行 Storm数据不经过磁盘, 在内存中流转, 通过网络直接发送给下游 流式处理(streaming) 与 批处理( ...
- python爬虫知识点总结(一)库的安装
环境要求: 1.编程语言版本python3: 2.系统:win10; 3.浏览器:Chrome68.0.3440.75:(如果不是最新版有可能影响到程序执行) 4.chromedriver2.41 注 ...
- Update(Stage4):spark_rdd算子:第2节 RDD_action算子_分区_缓存:算子和分区
一.reduce和reduceByKey: 二.:RDD 的算子总结 RDD 的算子大部分都会生成一些专用的 RDD map, flatMap, filter 等算子会生成 MapPartitions ...
- spark读取mongodb数据写入hive表中
一 环境: spark-: hive-; scala-; hadoop--cdh-; jdk-1.8; mongodb-2.4.10; 二.数据情况: MongoDB数据格式{ "_i ...
随机推荐
- python 函数定义及调用
1.什么是函数? 在程序中,函数就是具备某一功能的工具,事先将工具准备好即函数的定义:遇到应用场景拿来就用即函数的调用:函数必须遵循先定义后调用的原则 2.为什么要用函数 不用函数的问题是: 程序冗长 ...
- 2017-2018-2 20172310『Java程序设计』课程 结对编程练习_四则运算_第二周
2017-2018-2 20172310『Java程序设计』课程 结对编程练习_四则运算_第二周 博客要求 组内同学需各自发表博客 博客中需包含以下内容: 相关过程截图 关键代码解释 遇到的困难及解决 ...
- WebStorm中使用npm包管理器
1.首先安装Node.js,安装之后添加NodeJs的安装路径到系统Path环境变量,在控制台之中测试node,与npm命令是否工作正常. 2.配置npm的源为国内的淘宝镜像,这里不推荐使用cnpm ...
- 【NOI2015】【BZOJ4196】软件包管理器 - 题解
Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...
- C#数组,ArrayList,List
一.数组声明方式 1,声明一个未经初始化的数组引用,以后可以把这引用初使化为一个数组实例 int[] int_array; int_array = new int[2]; 注:数组的引用必须以相同或相 ...
- 基于zookeeper的高可用Hadoop HA集群安装
(1)hadoop2.7.1源码编译 http://aperise.iteye.com/blog/2246856 (2)hadoop2.7.1安装准备 http://aperise.iteye.com ...
- python之类和对象
对象(object)基本上可以看做数据(特性)以及由一系列可以存取.操作这些数据的方法所组成的集合. 类,可以看成种类,类型,从一组对象中提取到的相似部分.所有的对象都属于一个类,称为类的实例. 之前 ...
- 基于SwiperJs的H5/移动端下拉刷新上拉加载更多
最早时,公司的H5项目中曾用过点击一个"加载更多"的DOM元素来实现分页的功能,后来又用过网上有人写的一个上拉加载更多的插件,那个插件是页面将要滚动到底部时就自动请求数据并插入到页 ...
- Hibernate(12)_基于主键的双向1对1
一.基于主键的双向1对1 1.介绍: 基于主键的映射策略:指一端的主键生成器使用 foreign 策略,表明根据"对方"的主键来生成自己的主键,自己并不能独立生成主键. <p ...
- poj1064 Cable master(二分查找,精度)
https://vjudge.net/problem/POJ-1064 二分就相当于不停地折半试. C++AC,G++WA不知为何,有人说C函数ans那里爆int了,改了之后也没什么用. #inclu ...