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 ...
随机推荐
- [HNOI2018]寻宝游戏
Description: 给出\(n\)个长为\(m\)的01串,第0个为0,同时给出\(q\)个询问串,每次向其中添加\(n\)个\(\&\)或\(|\)符号,求使这些串按顺序运算得到询问串 ...
- MySQL(七)
视图 对于复杂的查询,在多次使用后,维护是一件非常麻烦的事情 解决:定义视图 视图本质就是对查询的一个封装 定义视图 create view stuscore as select students.* ...
- Android 去除应用标题栏(Android Studio)
修改styles.xml文件 <resources> <!-- Base application theme. --> <style name="AppThem ...
- jmeter接口测试实例5-文件上传
Jmeter实例5:文件上传 添加http协议.添加IP.路径.方法.选择files upload文件名称tab,输入绝对路径,参数名称,运行: 上传成功
- 经典SQL面试题(转)
以下题目都在MySQL上测试可行,有疏漏或有更优化的解决方法的话欢迎大家提出,我会持续更新的:) 有三个表,如果学生缺考,那么在成绩表中就不存在这个学生的这门课程成绩的记录,写一段SQL语句,检索出每 ...
- React组件通信技巧
效果图 communication.gif 点击查看Github完整源码 1.父向子通信 直接标签中插入参数即可 //number只是个例子 let _number = this.state.numb ...
- C# CountdownEvent实现
关于CountdownEvent网上的介绍比较少,因为它是实现和使用都很简单,先看看网上的一些评论吧: CountDownEvent调用成员函数Wait()将阻塞,直至成员函数Signal() 被调用 ...
- 【放松一下】北美小游戏排行榜TOP10——“点击英雄”
大家平时工作都比較忙,在这里推荐一款游戏让大家放松一下.让你体验到指数爆炸般挣钱的快感. 北美小游戏排行榜TOP10--"点击英雄" 简要说明: 游戏能够挂机,关闭电脑.游戏也会自 ...
- springcloud如何实现服务的平滑发布
在之前的文章中我们提到服务的优雅下线,见: SpringCloud服务如何在Eureka安全优雅的下线 但这个对于ribbon调用其实是不平滑的,shutdown请求到后服务就马上关闭了,服务消费此时 ...
- 【转】33 个 2017 年必须了解的 iOS 开源库
1.IGListKit,作者是Instagram Engineering Instagram 程序员做的,IGListKit 是数据驱动的 UICollectionView 框架,为了构建快速和可扩展 ...