【Spark】(八)Spark SQL 应用解析2

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
全局流量管理 GTM,标准版 1个月
简介: 【Spark】(八)Spark SQL 应用解析2

四、Spark SQL 操作Hive表


4.1 文件配置


分别复制 hive lib、conf 目录下文件到 spark 的jars 目录下

[root@zj1 sbin]# cd /opt/soft/hive110/lib/
[root@zj1 lib]# cp mysql-connector-java-5.1.39-bin.jar /opt/soft/spark234/jars/
[root@zj1 hive110]# cd conf/
[root@zj1 conf]# cp hive-site.xml /opt/soft/spark234/conf/


修改 spark hive-site.xml


加入

<property>
                <name>hive.metastore.uris</name>
                <value>thrift://zj1:9083</value>
        </property>

   

执行

hive --service metastore


4.1 操作 Hive 表

// 原有spark不支持 原有激活状态的spark先stop
scala> spark.stop
scala> import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.SparkSession
scala> val spark = SparkSession.builder().appName("spark-hive").enableHiveSupport.getOrCreate
// 通过SQL 命令直接操作 hive 表
scala> spark.sql("select * from mydemo.order").show
+----+----------+----+
|name| orderdate|cost|
+----+----------+----+
|jack|2015-04-03|  23|
|jack|2015-01-01|  10|
|tony|2015-01-02|  15|
|mart|2015-04-11|  75|
|neil|2015-06-12|  80|
|mart|2015-04-13|  94|
+----+----------+----+
scala> val spk= spark.sql("select * from mydemo.order")
scala> spk.repartition(1).write.format("csv").save("hdfs://192.168.56.137:9000/20200109")
// 如下 csv文件写到hdfs上

image.png

// 如下 表写到hive上
scala> spk.filter($"name".startsWith("jack")).write.saveAsTable("xxx")


我们到 hive 中查询结果 , 发现 hive 中出现 “xxx” 表

image.png


我们还可以通过spark 往表中插入数据

// 往 XXX 表中插入数据 
scala> spark.sql("insert into xxx values('jm','2020-09-09',99)")
1
2
五、Spark SQL 连 MySQL
// 启动 带jar 包
[root@zj1 bin]# ./spark-shell --jars /opt/soft/spark234/jars/mysql-connector-java-5.1.39-bin.jar
scala> val prop = new java.util.Properties
prop: java.util.Properties = {}
scala> prop.setProperty("driver","com.mysql.jdbc.Driver")
res0: Object = null
scala> prop.setProperty("user","root")
res1: Object = null
scala> prop.setProperty("password","ok")
res2: Object = null
// 从mysql中读取表
scala> val jdbcDF = spark.read.jdbc("jdbc:mysql://192.168.56.137:3306/mydemo","users",prop)
scala> jdbcDF.show
+---+--------+----------+                                                       
| id|username|  birthday|
+---+--------+----------+
|  1|      zs|1999-09-09|
|  2|      ls|1999-09-08|
|  4|      zl|1989-09-08|
+---+--------+----------+
// 过滤 
scala> jdbcDF.filter($"username".endsWith("s")).write.mode("append").jdbc("jdbc:mysql://192.168.56.137:3306/mydemo","myuser",prop)

image.png


六、Spark SQL 内置函数


// 建一个数组
val mylog = Array("2019-12-27,001","2019-12-27,001","2019-12-27,002","2019-12-28,001","2019-12-28,002","2019-12-28,002")
// 导包
import org.apache.spark.sql.Row
import org.apache.spark.sql.types._
// 根据集合数据生成RDD
scala> val rdd = sc.parallelize(mylog).map(x=>{
     | val sp = x.split(",")
     | Row(sp(0),sp(1).toInt)
     | })
 // 定义DataFrame的结构
val struct = StructType(Array(
StructField("day",StringType,true),
StructField("userid",IntegerType,true)
))
val df = spark.createDataFrame(rdd,struct)
scala> df.show
+----------+------+                                                             
|       day|userid|
+----------+------+
|2019-12-27|     1|
|2019-12-27|     1|
|2019-12-27|     2|
|2019-12-28|     1|
|2019-12-28|     2|
|2019-12-28|     2|
+----------+------+
import org.apache.spark.sql.functions._
scala> df.groupBy("day").agg(count("userid").as("pv")).show
+----------+---+                                                                
|       day| pv|
+----------+---+
|2019-12-28|  3|
|2019-12-27|  3|
+----------+---+
scala> df.groupBy("day").agg(countDistinct("userid").as("pv")).show
+----------+---+                                                                
|       day| pv|
+----------+---+
|2019-12-28|  2|
|2019-12-27|  2|
+----------+---+


七、Spark SQL 自定义函数


scala> val df = spark.read.format("csv").option("header","true").load("hdfs://192.168.56.137:9000/20200102/events.csv")
scala> df.printSchema
// 设置 自定义函数
scala> spark.udf.register("eaddu",(eid:String,uid:String)=>eid+uid)
scala> spark.sql("select event_id,eaddu(event_id,user_id) as fullid from events").show(3)
+----------+-------------------+
|  event_id|             fullid|
+----------+-------------------+
| 684921758|6849217583647864012|
| 244999119|2449991193476440521|
|3928440935|3928440935517514445|
+----------+-------------------+



目录
相关文章
|
3天前
|
安全 网络协议 应用服务中间件
AJP Connector:深入解析及在Apache HTTP Server中的应用
【9月更文挑战第6天】在Java Web应用开发中,Tomcat作为广泛使用的Servlet容器,经常与Apache HTTP Server结合使用,以提供高效、稳定的Web服务。而AJP Connector(Apache JServ Protocol Connector)作为连接Tomcat和Apache HTTP Server的重要桥梁,扮演着至关重要的角色
22 2
|
1天前
|
PHP 开发者
PHP 7新特性深度解析与实践应用
【9月更文挑战第17天】本文将深入探讨PHP 7的新特性及其对开发者的实际影响,同时通过实例演示如何有效利用这些特性优化代码和提高性能。我们将从类型声明的增强开始,逐步深入到其他关键改进点,最后通过一个综合案例展示如何将这些新特性应用于日常开发中。
|
7天前
|
存储 负载均衡 Java
Jetty技术深度解析及其在Java中的实战应用
【9月更文挑战第3天】Jetty,作为一款开源的、轻量级、高性能的Java Web服务器和Servlet容器,自1995年问世以来,凭借其卓越的性能、灵活的配置和丰富的扩展功能,在Java Web应用开发中占据了举足轻重的地位。本文将详细介绍Jetty的背景、核心功能点以及在Java中的实战应用,帮助开发者更好地理解和利用Jetty构建高效、可靠的Web服务。
21 2
|
10天前
|
编译器 PHP 开发者
PHP 8新特性解析与应用实践
PHP 8作为PHP语言的最新版本,带来了许多令人兴奋的新特性和性能改进。本文将深入探讨PHP 8中的JIT编译器、联合类型、匹配表达式等关键更新,并通过实例演示如何在项目中有效利用这些新工具,帮助开发者提升代码质量和执行效率。
|
13天前
|
C# Android开发 开发者
Uno Platform 高级定制秘籍:深度解析与实践样式和模板应用,助你打造统一且高效的跨平台UI设计
【9月更文挑战第7天】Uno Platform 是一个强大的框架,支持使用 C# 和 XAML 创建跨平台 UI 应用,覆盖 Windows、iOS、Android、macOS 和 WebAssembly。本文介绍 Uno Platform 中样式和模板的应用,助力开发者提升界面一致性与开发效率。样式定义控件外观,如颜色和字体;模板则详细定制控件布局。通过 XAML 定义样式和模板,并可在资源字典中全局应用或嵌套扩展。合理利用样式和模板能简化代码、保持设计一致性和提高维护性,帮助开发者构建美观高效的跨平台应用。
26 1
|
5天前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
17 0
|
19天前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
79 0
|
19天前
|
定位技术
|
19天前
|
存储 C# 关系型数据库
“云端融合:WPF应用无缝对接Azure与AWS——从Blob存储到RDS数据库,全面解析跨平台云服务集成的最佳实践”
【8月更文挑战第31天】本文探讨了如何将Windows Presentation Foundation(WPF)应用与Microsoft Azure和Amazon Web Services(AWS)两大主流云平台无缝集成。通过具体示例代码展示了如何利用Azure Blob Storage存储非结构化数据、Azure Cosmos DB进行分布式数据库操作;同时介绍了如何借助Amazon S3实现大规模数据存储及通过Amazon RDS简化数据库管理。这不仅提升了WPF应用的可扩展性和可用性,还降低了基础设施成本。
41 0
|
19天前
|
区块链 C# 存储
链动未来:WPF与区块链的创新融合——从智能合约到去中心化应用,全方位解析开发安全可靠DApp的最佳路径
【8月更文挑战第31天】本文以问答形式详细介绍了区块链技术的特点及其在Windows Presentation Foundation(WPF)中的集成方法。通过示例代码展示了如何选择合适的区块链平台、创建智能合约,并在WPF应用中与其交互,实现安全可靠的消息存储和检索功能。希望这能为WPF开发者提供区块链技术应用的参考与灵感。
33 0

推荐镜像

更多