三、基于DSL的DataFrame的数据操作(DSL:Domain Spcific Language,领域特定的语言,类似RDD算子)
1、数据查询:
(1)筛选:where()/filter()
df1 = df.where('age>=10')
df2= df.where('age>=12 and score>80') df.where( 'age>=12 and score>80').show()
df.where( (df.age>12) & (df.score>80)).show() df.where(df,score>85).show( )
(2)排序:sort()/orderBy()
df.sort(df.age,df .score ,ascending=[1,0]).show() #1=True: 升序,0=False:降序 df.sort(df.age.asc(),df.score.desc()).show() #desc:降序,asc:升序
(3) 分组:groupBy()
对应的聚合函数:
count()/mean(),avg()/max(),min()/sum() df.groupBy('gender').count().show( )
df.groupBy( 'gender' ).agg({'age ' : 'mean' ,'score' : 'max'}) .show() #agg()聚合操作,aggregate
(4)查询:select/selectExpr(查询加强版)
df.select('*').show( )
df.select(df.age,df.score) .show( ) df.select('name" ,"age').show( )
df.selectExpr('name' ,'age*2 as newage') . show( )
2、数据处理:
(1)去重(行):
distinct():删除完全重复的行数据
df1.distinct().show():
dropDuplicates(['指定的字段']):删除指定的相同字段的行数据
df1.dropDuplicates(['gender ']).show()
(2)删除(行/列):
dropna():删除有缺省nu11值的行(数据清洗经常用到的方法)
drop('指定的字段'):删除指定的字段列,影响所有记录 df1.drop('gender' ).show()
(3)限行:limit(行数)
df1.limit(2).show( )
(4)添加列:
withColumn('新字段名',upper(col('原字段'))/lit()):新增列字段(包括字段名和值)
from pyspark.sq1.functions import col,lit,upper
df1.withColumn('add',lit('上海')).show()
(5) df1.intersectAll(df2):交集
df1.unionByName(df2):并集
四、基于SQL的DataFrame的数据操作(SQL:Structured Query Language,使用spark.sq1()方法来执行SQL相关的语句)
1、临时视图的创建与删除
(1) df1 = spark.read.csv('file:///home/spark/mydata/03/sql_website.csv',header=True,inferSchema=True)
df2 =spark.read.csv("file:///home/spark/mydata/03/sql_access_log.csv',header=True, inferSchema=True) df1.createOrReplaceTempView("website')
#a,创建局部临时视图表
df2.create0rReplaceGlobalTempView('access_log')#创建全局临时视图表
(2) spark.sql('select * from website').show()#b.访问临时表
spark.sql('select * from global_temp.access_log'). show( )
(3) spark.catalog.dropTempView('website') #c.删除临时表
spark.catalog.dropGlobalTempView(access_log)
# SQL 与 DSEL 的区别
SQL (Structured Query Language) 和 DSEL (Domain-Specific Embedded Language) 是两种不同类型的语言,主要区别如下:
## SQL (结构化查询语言)
- **用途**:专门用于管理和操作关系型数据库
- **类型**:声明式语言(告诉系统"做什么"而不是"如何做")
- **标准化**:有ANSI/ISO标准,尽管各数据库实现有差异
- **功能**:
- 数据查询(SELECT)
- 数据操作(INSERT, UPDATE, DELETE)
- 数据定义(CREATE, ALTER, DROP)
- 数据控制(GRANT, REVOKE)
## DSEL (领域特定嵌入式语言)
- **用途**:针对特定领域设计的嵌入式语言
- **类型**:通常是宿主语言的一部分(如Haskell、Scala中的嵌入式DSL)
- **特点**:
- 专注于解决特定领域问题
- 语法和语义针对特定领域优化
- 通常嵌入在通用编程语言中使用
- 没有统一标准,每种实现各不相同
## 主要区别
1. **通用性**:SQL是专门用于数据库的,而DSEL可以针对任何领域
2. **实现方式**:SQL是独立语言,DSEL通常是嵌入在宿主语言中的
3. **执行环境**:SQL在数据库引擎中执行,DSEL在宿主语言环境中执行
4. **表达能力**:DSEL可以更贴近特定领域的问题表达
举例来说,Haskell中的Esqueleto库就是一个数据库查询的DSEL,它提供了类似SQL的功能但完全嵌入在Haskell中,具有类型安全等优势。
# JSON 文件
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。
## JSON 文件的基本结构
JSON 文件由两种基本结构组成:
1. **键值对集合**(对象):用花括号 `{}` 包围
2. **值的有序列表**(数组):用方括号 `[]` 包围
### 示例
```json
{ "name": "John Doe",
"age": 30,
"isStudent": false,
"address":
{ "street": "123 Main St",
"city": "New York"},
"hobbies": ["reading", "hiking", "coding"],
"contacts":
[ {"type": "email",
"value": "john@example.com"},
{ "type": "phone",
"value": "+1234567890" }]}```
## JSON 数据类型
JSON 支持以下数据类型:
- 字符串(必须用双引号)
- 数字(整数或浮点数)
- 布尔值(true/false)
- 数组
- 对象
- null
## JSON 文件的特点
1. **轻量级**:比XML更简洁
2. **可读性好**:结构清晰,易于理解
3. **语言无关**:几乎所有编程语言都支持
4. **自描述性**:数据本身包含结构信息
## JSON 文件的使用场景
- 配置文件(如package.json)
- API数据交换格式
- 存储简单数据结构
- 前后端通信
- NoSQL数据库(如MongoDB)的数据格式
## JSON 与 XML 比较
| 特性 | JSON | XML |
|----------------|----------------|----------------------------|
| 语法 | 更简洁 | 更冗长 |
| 解析难度 | 更易解析 | 需要复杂解析器 |
| 数据类型 | 基本类型 | 需要定义schema|
| 可读性 | 较好 | 较差 |
| 命名空间 | 不支持 | 支持 |
## JSON 工具
- 验证工具:JSONLint
- 格式化工具:大多数代码编辑器都支持
- 在线查看器:JSON Viewer等
JSON 因其简单性和灵活性,已成为现代Web开发中最常用的数据格式之一。