当前位置:   article > 正文

大数据技术之Spark——Spark SQL,大数据开发高级开发面试题以及答案_spark sql面试题

spark sql面试题

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

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

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

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

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

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

正文


**2)对DataFrame创建一个临时表**



  • 1
  • 2
  • 3
  • 4
  • 5

dataFrame.createTempView(“user”)
// 或
dataFrame.createOrReplaceTempView(“user”)


**3)通过SQL语句实现查询全表**



  • 1
  • 2
  • 3
  • 4
  • 5

val frame = spark.sql(“select * from user”)


**4)结果展示**



  • 1
  • 2
  • 3
  • 4
  • 5

frame.show()


 ![](https://img-blog.csdnimg.cn/bbb410cf2963482d8af4a2e0e6ad6012.png)



> 
>  注意:
> 
> 
> 普通临时表是 Session 范围内的,如果想应用范围内有效,可以使用全局临时表。使用全局临时表时需要全路径访问,如:global\_temp.people
> 
> 
> 


### 


#### 2.2.3 DSL语法


        DataFrame提供一个特定领域语言(domain-specific kanguage, DSL)去管理结构化的数据。可以在Sacla, Java, Python和 R 中使用DSL,使用DSL语法风格不必去创建临时试图了。


**1)创建一个DataFrame**



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

val df = spark.read.json(“in/user.json”)


**2)查看DataFrame的Schema信息**



  • 1
  • 2
  • 3
  • 4
  • 5

df.printSchema()


**3)只查看列数据的6种方式**



> 
> 
>  注意:涉及到运算的时候, 每列都必须使用$, 或者采用引号表达式:单引号+字段名 
>  
> 



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

// 输出的6种方式
import spark.implicits._
userDF.select('name,'age).show()
userDF.select(“name”,“age”).show()
userDF.select( " n a m e " , "name", "name",“age”).show()

userDF.select(userDF("name"),userDF("age")).show()

userDF.select(col("name"),col("age")).show()
userDF.select(column("name"),column("age")).show()

val idColumn = df("id")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6


**4)查看“age”大于“22”的数据**


条件过滤可以使用filter,也可以使用where,where的底层调用的也是filter方法。



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

df.select(userDF(“name”),userDF(“age”),(userDF(“age”)+1).as(“ageinc”))
.where( " n a m e " = ! = " z h a n g s a n " ) . s h o w ( ) / / w h e r e 底层也是 f i l t e r / / . f i l t e r ( "name"=!="zhangsan").show() // where底层也是filter // .filter( "name"=!="zhangsan").show()//where底层也是filter//.filter(“ageinc”>22).show()


**5)按照“age”分区,查看数据条数**



  • 1
  • 2
  • 3
  • 4
  • 5

val countDF = df.groupBy(“age”).count()
countDF.printSchema()


**6)增加列****withColumn**



  • 1
  • 2
  • 3
  • 4
  • 5

val frame = countDF.withColumn(“number”,$“count”.cast(StringType))


**7)修改列名withColumnRenamed**



  • 1
  • 2
  • 3
  • 4
  • 5

val frame2 = countDF.withColumnRenamed(“count”,“number”)


### 


#### 2.2.4 RDD转换为DataFrame


        在 IDEA 中开发程序时,如果需要 RDD 与 DF 或者 DS 之间互相操作,那么需要引入**import spark.implicits.\_**


        这里的 spark 不是 Scala 中的包名,而是创建的 sparkSession 对象的变量名称,所以必 须先创建 SparkSession 对象再导入。这里的 spark 对象不能使用 var 声明,因为 Scala 只支持 val 修饰的对象的引入。



> 
> **rdd =>DataFrame**: rdd.toDF
> 
> 
> **DataFrame => rdd**: df.rdd
> 
> 
> 


![](https://img-blog.csdnimg.cn/a66286b6480342d3acec9e23bb758bc3.png)



### 2.3 DataSet


        DataSet是具有**强类型**的数据集合,需要提供对于的类型信息。


#### 2.3.1 创建DataSet



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

object DataSetDemo {

// 1)使用样例类来创建DataSet
case class Point(label:String,x:Double,y:Double)
case class Category(id:Long,name:String)

def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().master(“local”).appName(“dataSet”).getOrCreate()
val sc = spark.sparkContext

// 重点记忆
import spark.implicits._

// 2)使用基本类型的序列创建DataSet
val points: Seq[Point] = Seq(Point(“nj”, 23.43, 57.12), Point(“bj”, 18.21, 199.43), Point(“sh”, 16.11, 18.3))
val pointDS = points.toDS()

val categories: Seq[Category] = Seq(Category(1, "nj"), Category(2, "bj"))
val categoryDS = categories.toDS()
categoryDS.printSchema()
categoryDS.show()
  • 1
  • 2
  • 3
  • 4

}



> 
> 
> **注意**: 
>  
> 
>          在实际使用的时候,很少用到把序列转换成DataSet,更多的是通过RDD来得到DataSet。 
>  
> 



#### 2.3.2 RDD转换为DataSet


        SparkSQL能够自动将包含case类的RDD转换成DataSet,case类定义了table的结构,case类属性通过反射编程了表的列名。case类可以包含如Seq或者Array等复杂的结构。



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

case class User(name: String, age: Int)

sc.makeRDD(Seq((“zhangsan”,18), (“zhaosi”,20))).toDS



#### 2.3.3 DataSet转换为RDD


        DataSet也是对RDD的封装,所以可以直接获得内部的RDD。



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

case class User(name: String, age: Int)
val res1 = sc.makeRDD(Seq((“zhangsan”,18), (“zhaosi”,20))).toDS

val rdd = res1.rdd



#### 2.3.4 DataFrame和DataSet转换



> 
> **DataFrame => DataSet**:as[样例类]
> 
> 
> **DataSet => DataFrame**:toDF
> 
> 
> 



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

case class User(name: String, age: Int)
val userDF = sc.makeRDD(Seq((“zhangsan”,18), (“zhaosi”,20))).toDF(“name”, “age”)

val userDS = userDF.as[User]



### **2.4 RDD、DataFrame、DataSet 三者的关系**


#### **2.4.1 相互转化**


![](https://img-blog.csdnimg.cn/eca482cbdbed4d728fab80a90d8c6df5.png)



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

// RDD <=> DataFrame
val rdd = spark.sparkContext.makeRDD(List(1,“zhangsan”,30),(2,“lisi”,40))
val df: DataFrame = rdd.toDF(“id”,“name”,“age”)
val rowRDD:RDD[Row] = df.rdd

// DataFrame <=> DataFrame
val ds:Dataset[User] = df.as[User]
val df1:DataFrame = ds.toDF()

// RDD <=> DataSet
rdd.map {
case (id, name, age) =>{
User(id, name, age)
}
}
val userRDD:RAA[User] = ds1.rdd


 


####  2.4.2 三者的共性



> 
> 1. 都是spark平台下的分布式弹性数据集,为处理超大型数据提供便利
> 
> 
> 2. 都有惰性机制,在创建、转换时,不会立即执行。只有在遇到行动算子时,才会开始运行
> 
> 
> 3. 有很多共同的函数
> 
> 
> 4. DataFrame 和 DataSet 许多操作都需要导入包:**import spark.implicits.\_**
> 
> 
> 5. 都会根据Spark的内存情况自动缓存运算,即使数据量很大,也不用担心内存溢出
> 
> 
> 6. 都有partition的概念
> 
> 
> 7.  DataFrame 和 DataSet 都可以使用匹配模式获取各个字段的值和类型
> 
> 
> 


#### 2.4.3 三者的区别



> 
> **1)RDD**
> 
> 
> * RDD一般和spark mllib同时使用
> * RDD不支持sparkSQL操作
> 
> 
> **2)DataFrame**
> 
> 
> * RDD和DataFrame不同,DataFrame每一行的类型固定为Row,每一列的值无法直接访问,只有通过解析才能获取各个字段的值
> * DataFrame 和 DataSet 一般捕鱼spark mllib 同时使用
> * DataFrame 和 DataSet 都支持SparkSQL操作,如select,groupby等。同事也能注册临时表/视窗,进行sql语句操作。
> * DataFrame 和 DataSet支持一些方便的保存方式,比如保存成csv,可以带上表头
> 
> 
> **3)DataSet**
> 
> 
> * DataFrame 和 DataSet拥有完全相同的成员函数,区别只是每一行的数据类型不同。DataFrame其实就是DataSet的一个特例
> * DataFrame 也可以叫 DataSet[Row],每一行的类型是Row
> 
> 
> 



## 三、**SparkSQL连接Hive**



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

object SparkHive {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.appName(“sparkHive”)
.master(“local[*]”)
.config(“hive.metastore.uris”, “thrift://192.168.153.139:9083”)
.enableHiveSupport()
.getOrCreate()

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

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
img

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

ster(“local[*]”)
.config(“hive.metastore.uris”, “thrift://192.168.153.139:9083”)
.enableHiveSupport()
.getOrCreate()

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/568127
推荐阅读
相关标签
  

闽ICP备14008679号