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 ...
随机推荐
- C++程序设计方法3:类中的静态成员
在类型前面加static修饰的数据成员,是隶属于类的,成为类的静态数据成员,也称为“类的变量” 静态数据成员被该类的所有对象共享(即所有对象中的这个数据域实际上处于同一个内存位置) 静态数据要在实现文 ...
- Coins [POJ1742] [DP]
Description 给出硬币面额及每种硬币的个数,求从1到m能凑出面额的个数. Input 多组数据,每组数据前两个数字为n,m.n表示硬币种类数,m为最大面额,之后前n个数为每种硬币的面额, ...
- h5本地缓存(localStorage,sessionStorage)
H5本地存储数据 localStorage,sessionStorage的区别: 相同点: 缓存数据比cookie的范围大; localStorage:关闭浏览器数据不会消失,除非手动删除数据 se ...
- Mac下nodeJS初体验
Mac下nodeJS初体验 这两天博主出门在外,抽空体验一下大名鼎鼎的node 安装 brew install node 安装测试 $ node -v v8.4.0 运行本地脚本 用文本编辑器编辑一段 ...
- 如何修改CCS 7.2 代码和注释的颜色以及折叠代码
默认的字体总是让人感觉很难受,作为一个热爱生活的人,工作的时候也得尽力创造一个舒适的环境----程序猿们,对自己好一点. 首先废话一下--------------------------------- ...
- Word2vec的Skip-Gram 系列1
转自雷锋网的一篇很棒的文章,写的通俗易懂.自己消化学习了.原文地址是 https://www.leiphone.com/news/201706/PamWKpfRFEI42McI.html 这次的分享主 ...
- Servlet(6)—HttpServletRequest接口和HttpServletResponse接口
HttpServletRequest接口和HttpServletResponse接口是继承ServletRequest和ServletResponse接口,是他们的子接口,但是我们在程序中进程看到Se ...
- 解决错误:Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package.
原因是代码直接放在默认包里边,比如src\main\java目录下 应该在src\main\java下建立子目录,比如src\main\java\com\test 这样的话,代码就在com.test这 ...
- [Web 前端] qs.parse()、qs.stringify()使用方法
cp from : https://blog.csdn.net/suwu150/article/details/78333452 qs是一个npm仓库所管理的包,可通过npm install qs命令 ...
- linux下的EDA——VCS使用
原帖地址:https://blog.csdn.net/moon9999/article/details/75283926 在Linux下对verilogHDL进行功能仿真时非常必要的,下面提供两种常见 ...