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 ...
随机推荐
- JS引用类型之Array
ECMAScript中的数组可以说是比较神奇了, ECMAScript中定义的数组每一项可以保存不同的数据类型,如第一项为字符串,第二项为数值等等 1. 那怎么创建一个数组呢? 方法和创建对象实例类似 ...
- Hadoop2之NameNode HA详解
在Hadoop1中NameNode存在一个单点故障问题,如果NameNode所在的机器发生故障,整个集群就将不可用(Hadoop1中虽然有个SecorndaryNameNode,但是它并不是NameN ...
- python-猜数字小练习
isdigit的使用方法,只能对str类型的适用,判断输入的字符串里面是不是仅由数字组成: 本次在写这个小程序时踩到的坑:1.int类型和字符串类型不可以做比较:2.在input下面对guess做了类 ...
- HTTP1.1协议-RFC2616-中文版课前资料收集
1.http rfc大致讲了什么? 2.解决了什么问题? HTTP协议描述的是发送方与接收方的通信协议 协议功能: HTTP协议(HyperText Transfer Protocol,超文本传输协议 ...
- poj3009 Curling 2.0(很好的题 DFS)
https://vjudge.net/problem/POJ-3009 做完这道题,感觉自己对dfs的理解应该又深刻了. 1.一般来说最小步数都用bfs求,但是这题因为状态记录很麻烦,所以可以用dfs ...
- C# StreamReader.ReadLine统计行数的问题
要实现一个功能: 从 lua 文件中提取字符串放到 excel 中,再将 excel 给海外同事,翻译完成后,用翻译的文本替换相应中文. 整个功能并不复杂,要点有二点: 1.提取字符串,一行中文如&q ...
- Spring Boot 中application.yml与bootstrap.yml的区别
其实yml和properties文件是一样的原理,且一个项目上要么yml或者properties,二选一的存在. 推荐使用yml,更简洁. bootstrap与application1.加载顺序这里主 ...
- PDF.js实现个性化PDF渲染(文本复制)
我肥来啦
- oracle显示一个月的所有天数
效率高: ) s_date from dual connect 效率低: select to_date() s_date from all_tables where rownum <= ( fr ...
- jvm理论-class文件
当JVM运行Java程序的时候,它会加载对应的class文件,并提取class文件中的信息存放在JVM的方法区内存中. Class文件组成 1.Class文件是一组以8位字节为基础单位的二进制流,各个 ...