【Spark】(八)Spark SQL 应用解析_sparksql map(c=>col(c)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

// 方法二
val custs = sc.textFile(“hdfs://192.168.56.137:9000/20200106/customers.csv”).map(_.replaceAll(“”“,”“).split(”,")).map(x=>Customers(x(0),x(1),x(2),x(3),x(4),x(5),x(6),x(7),x(8))).toDS.show(1)

val ords = sc.textFile(“hdfs://192.168.56.137:9000/20200106/orders.csv”).map(_.replaceAll(“”“,”“).split(”,")).map(x=>Orders(x(0),x(1),x(2),x(3))).toDS

val items = sc.textFile(“hdfs://192.168.56.137:9000/20200106/order_items.csv”).map(_.replaceAll(“”“,”“).split(”,")).map(x=>OrderItem(x(0),x(1),x(2),x(3),x(4),x(5))).toDS


##### 3、使用DataSet完成Demo


* 如上我们已经使用RDD装载业务数据
* 定义样例类
* 将RDD转换为DataSet



// 连接查询 谁的消费额最高 三表查询

val tabitem = items.groupBy(“ordid”).agg(sum($“cp”).as(“countPrice”))

val tabord = tabitem.join(ords,tabitem(“ordid”)===ords(“orderid”))

tabord.show(2)
±----±---------±------±------------------±-----±--------------+
|ordid|countPrice|orderid| orddate|custid| status|
±----±---------±------±------------------±-----±--------------+
|10096| 369.97| 10096|2013-09-25 00:00:00| 10503|PENDING_PAYMENT|
|10351| 299.98| 10351|2013-09-27 00:00:00| 723| ON_HOLD|
±----±---------±------±------------------±-----±--------------+

tabord.where(“ordid=1”).show()
±----±---------±------------------±-----±-----+
|ordid|countPrice| orddate|custid|status|
±----±---------±------------------±-----±-----+
| 1| 299.98|2013-07-25 00:00:00| 11599|CLOSED|
±----±---------±------------------±-----±-----+

tabord.orderBy(desc(“countPrice”)).show(3)
±----±-----------------±------------------±-----±-------+
|ordid| countPrice| orddate|custid| status|
±----±-----------------±------------------±-----±-------+
|68703|3089.9500000000003|2013-08-16 00:00:00| 9515|COMPLETE|
|68724| 2609.93|2013-09-26 00:00:00| 1148|COMPLETE|
|68809| 2579.94|2014-03-12 00:00:00| 5946| ON_HOLD|
±----±-----------------±------------------±-----±-------+

tabord.orderBy(desc(“countPrice”)).limit(1).show
±----±-----------------±------------------±-----±-------+
|ordid| countPrice| orddate|custid| status|
±----±-----------------±------------------±-----±-------+
|68703|3089.9500000000003|2013-08-16 00:00:00| 9515|COMPLETE|
±----±-----------------±------------------±-----±-------+

val tabod=tabord.orderBy(desc(“countPrice”)).limit(1)

tabod.join(custs,tabod(“custid”)===custs(“custid”))
.select(col(“lname”),col(“fname”),col(“countPrice”)).show
±-------±----±-----------------+
| lname|fname| countPrice|
±-------±----±-----------------+
|Victoria|Smith|3089.9500000000003|
±-------±----±-----------------+

// 哪个产品销量最高

val procounts =items.groupBy(“proid”)
.agg(sum($“buynum”).as(“countnum”))
.orderBy(desc(“countnum”)).limit(1)

procounts
.join(pros,procounts(“proid”)===pros(“proid”))
.drop(pros(“proid”))
.select(col(“proid”),col(“protype”),col(“proname”),col(“countnum”)).show

±----±------±-------------------±-------+
|proid|protype| proname|countnum|
±----±------±-------------------±-------+
| 365| 17|Perfect Fitness P…| 73698.0|
±----±------±-------------------±-------+


#### 3.3 DataFrame


![在这里插入图片描述](https://img-blog.csdnimg.cn/20200110000324499.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JlaWlzQmVp,size_16,color_FFFFFF,t_70#pic_center)


在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。DataFrame与RDD的主要区别在于,前者带有schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型。这使得Spark SQL得以洞察更多的结构信息,从而对藏于DataFrame背后的数据源以及作用于DataFrame之上的变换进行了针对性的优化,最终达到大幅提升运行时效率的目标。反观RDD,由于无从得知所存数据元素的具体内部结构,Spark Core只能在stage层面进行简单、通用的流水线优化。


![在这里插入图片描述](https://img-blog.csdnimg.cn/20200110000408785.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JlaWlzQmVp,size_1,color_FFFFFF,t_70#pic_center)


##### 1、创建 DataFrame



scala> val cus = spark.read.format(“csv”).option(“header”,“true”).load(“hdfs://192.168.56.137:9000/20200102/events.csv”)

// 使用printSchema方法输出DataFrame的Schema信息
scala> cus.printSchema

// 表头有名字 直接注册一个临时表
scala> cus.registerTempTable(“users”)

// sql()方法执行SQL查询操作
scala> spark.sql(“select * from users”).show(2)
scala> spark.sql(“select event_id,user_id from users”).show(2)



// 表头没名字

scala> val cs = spark.read.format(“csv”).load(“hdfs://192.168.56.137:9000/20200106/customers.csv”)

scala> cs.printSchema
root
|-- _c0: string (nullable = true)
|-- _c1: string (nullable = true)
|-- _c2: string (nullable = true)
|-- _c3: string (nullable = true)
|-- _c4: string (nullable = true)
|-- _c5: string (nullable = true)
|-- _c6: string (nullable = true)
|-- _c7: string (nullable = true)
|-- _c8: string (nullable = true)

// 单个命名
scala> cs.withColumnRenamed(“_c0”,“id”)

// 多个命名
scala> val lookup = Map(“_c0”->“id”,“_c1”->“lname”)
scala> cs.select(cs.columns.map(c=>col©.as(lookup.getOrElse(c,c))):*)
scala> cs.select(cs.columns.map(c=>col©.as(lookup.getOrElse(c,c))):
*).registerTempTable(“abc”)
scala> spark.sql(“select id,lname from abc”).show(2)
±–±------+
| id| lname|
±–±------+
| 1|Richard|
| 2| Mary|
±–±------+


##### 2、使用DataFrame完成Demo



val custs = spark.read.format(“csv”).load(“hdfs://192.168.56.137:9000/20200106/customers.csv”)
val ords = spark.read.format(“csv”).load(“hdfs://192.168.56.137:9000/20200106/orders.csv”)
val items = spark.read.format(“csv”).load(“hdfs://192.168.56.137:9000/20200106/order_items.csv”)
val pros = spark.read.format(“csv”).load(“hdfs://192.168.56.137:9000/20200106/products.csv”)

val lookup = Map(“_c0”->“ordid”,“_c1”->“orddate”,“_c2”->“custid”,“_c3”->“status”)

ords.select(ords.columns.map(c=>col©.as(lookup.getOrElse(c,c))):_*).registerTempTable(“ordstab”)

spark.sql(“select dayofweek(orddate) as week,count(ordid) as countnum from ordstab group by week”)
±—±-------+
|week|countnum|
±—±-------+
| 1| 9735|
| 6| 10288|
| 3| 9964|
| 5| 9862|
| 4| 9758|
| 7| 9984|
| 2| 9292|
±—±-------+

val lookup = Map(“_c0”->“custid”,“_c1”->“lname”,“_c2”->“fname”,“_c3”->“cardno”,“_c4”->“addr”,“_c5”->“area”,“_c6”->“city”,“_c7”->“language”,“_c8”->“score”)

custs.select(custs.columns.map(c=>col©.as(lookup.getOrElse(c,c))):_*).registerTempTable(“custstab”)

val lookup = Map(“_c0”->“oiid”,“_c1”->“ordid”,“_c2”->“proid”,“_c3”->“buynum”,“_c4”->“sp”,“_c5”->“cp”)

items.select(items.columns.map(c=>col©.as(lookup.getOrElse(c,c))):_*).registerTempTable(“itemstab”)

spark.sql(“select c.city ,sum(t.sp) as total_purchasses from itemstab as t inner join ordstab as o on o.ordid=t.ordid inner join custstab as c on c.custid=o.custid group by c.city order by total_purchasses desc”)


### 四、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上


![在这里插入图片描述](https://img-blog.csdnimg.cn/20200110003237393.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JlaWlzQmVp,size_1,color_FFFFFF,t_70#pic_center)



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


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


![在这里插入图片描述](https://img-blog.csdnimg.cn/20200110003545399.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JlaWlzQmVp,size_1,color_FFFFFF,t_70)  
 我们还可以通过spark 往表中插入数据



// 往 XXX 表中插入数据
scala> spark.sql(“insert into xxx values(‘jm’,‘2020-09-09’,99)”)


### 五、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)


![在这里插入图片描述](https://img-blog.csdnimg.cn/20200110003920517.png#pic_center)


### 六、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|
±---------±–+



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
![img](https://img-blog.csdnimg.cn/img_convert/96c79bf5551b787ebc0f0f4f4fb4bd0f.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

                                                            
|       day| pv|
+----------+---+
|2019-12-28|  2|
|2019-12-27|  2|
+----------+---+


网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
[外链图片转存中…(img-BlfncqzY-1713351282284)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要在Spark中启用Kafka Stream,以便从Kafka主题中拉取数据。然后,使用Spark SQL和DataFrame API对数据进行处理和分析。最后,你可以将分析结果存储到Hive中。 以下是一些基本步骤: 1. 在pom.xml或build.gradle中添加Kafka和Spark Streaming依赖项。 2. 创建一个KafkaStream,设置Kafka连接参数和主题名称,并使用Spark Streaming API拉取数据。 3. 使用Spark SQL将KafkaStream转换为DataFrame,并对其进行清理和转换。 4. 使用DataFrame API或SQL查询对数据进行分析和计算。 5. 将结果写入Hive表中,以便进一步查询和分析。 以下是一些示例代码: ```scala import org.apache.spark.streaming.kafka._ import org.apache.spark.streaming._ import org.apache.spark.sql._ val ssc = new StreamingContext(sparkConf, Seconds(5)) val kafkaParams = Map[String, String]( "bootstrap.servers" -&gt; "localhost:9092", "key.deserializer" -&gt; classOf[StringDeserializer].getName, "value.deserializer" -&gt; classOf[StringDeserializer].getName, "group.id" -&gt; "traffic_group" ) val topics = Array("traffic_data") val stream = KafkaUtils.createDirectStream[String, String]( ssc, LocationStrategies.PreferConsistent, ConsumerStrategies.Subscribe[String, String](topics, kafkaParams) ) // 将KafkaStream转换为DataFrame val df = stream.map(_.value).toDF() // 对DataFrame进行清理和转换 val cleanedDf = df.select( from_json(col("value"), trafficSchema).as("traffic") ).selectExpr("traffic.*") // 对数据进行分析和计算 val resultDf = cleanedDf.groupBy("road").agg(avg("speed"), max("volume")) // 将结果写入Hive表中 resultDf.write.mode("overwrite").saveAsTable("traffic_analysis") ``` 上面的示例代码演示了从Kafka主题中拉取交通数据,并使用Spark SQL和DataFrame API进行分析和计算,然后将结果写入Hive表中。你需要根据你的数据和需求进行适当的修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值