一、SparkSQL的内置函数(Python)
1. 聚合函数:
```python
from pyspark.sql.functions import sum, avg, count, max, min
# 计算salary的总和
df.select(sum("salary")).show()
# 计算salary的平均值
df.select(avg("salary")).show()
# 计算employee表中的记录数
df.select(count("*")).show()
# 计算年龄的最大值
df.select(max("age")).show()
# 计算年龄的最小值
df.select(min("age")).show()
```
2. 字符串函数:
```python
from pyspark.sql.functions import concat, substring, trim, lower, upper
# 将first_name和last_name连接成一个字符串
df.select(concat("first_name", " ", "last_name").alias("full_name")).show()
# 获取title的前3个字符
df.select(substring("title", 1, 3)).show()
# 去除字符串两侧的空格
df.select(trim(" hello ")).show()
# 将first_name转换为小写字母
df.select(lower("first_name")).show()
# 将last_name转换为大写字母
df.select(upper("last_name")).show()
```
3. 日期函数:
```python
from pyspark.sql.functions import year, month, dayofmonth, hour, minute, second
# 获取birthday的年份
df.select(year("birthday")).show()
# 获取hire_date的月份
df.select(month("hire_date")).show()
# 获取birthday的日份
df.select(dayofmonth("birthday")).show()
# 获取hire_date的小时数
df.select(hour("hire_date")).show()
# 获取hire_date的分钟数
df.select(minute("hire_date")).show()
# 获取hire_date的秒数
df.select(second("hire_date")).show()
```
4. 数学函数:
```python
from pyspark.sql.functions import abs, ceil, floor, round
# 计算salary的绝对值
df.select(abs("salary")).show()
# 对salary进行向上取整
df.select(ceil("salary")).show()
# 对salary进行向下取整
df.select(floor("salary")).show()
# 对salary进行四舍五入,保留两位小数
df.select(round("salary", 2)).show()
```
5. 条件函数:
```python
from pyspark.sql.functions import when
# 如果salary大于10000,则返回'high',否则返回'low'
df.select(when(df.salary > 10000, 'high').otherwise('low')).show()
# 如果age大于30,则返回'old',否则返回'young'
df.select(when(df.age > 30, 'old').otherwise('young')).show()
```
6. 数组函数:
```python
from pyspark.sql.functions import array, array_contains, size
# 创建一个数组
df.select(array([1, 2, 3])).show()
# 判断数组arr中是否包含2
df.select(array_contains("arr", 2)).show()
# 获取数组arr的长度
df.select(size("arr")).show()
```
7. Map函数:
```python
from pyspark.sql.functions import create_map, map_keys, map_values
# 创建一个Map
df.select(create_map("key1", "value1", "key2", "value2")).show()
# 获取map中的所有key
df.select(map_keys("map")).show()
# 获取map中的所有value
df.select(map_values("map")).show()
```
二、SparkSQL中的高级函数(Python)
1. Window函数:用于对数据进行窗口分析,包括ROW_NUMBER、RANK、DENSE_RANK、NTILE等。
```python
from pyspark.sql.window import Window
from pyspark.sql.functions import row_number, rank, dense_rank, ntile
# 创建窗口
window = Window.partitionBy("department").orderBy("salary")
# 对每个部门内的记录按照salary进行排序,并给出每条记录的行号
df.select("department", "name", "salary", row_number().over(window).alias("row_number")).show()
# 对每个部门内的记录按照salary进行排序,并给出每个salary排名
df.select("department", "name", "salary", rank().over(window).alias("rank")).show()
# 对每个部门内的记录按照salary进行排序,并给出每个salary的密集排名
df.select("department", "name", "salary", dense_rank().over(window).alias("dense_rank")).show()
# 对每个部门内的记录按照salary进行排序,并将数据分成4组,给出每条记录所在组的编号
df.select("department", "name", "salary", ntile(4).over(window).alias("ntile")).show()
```
2. 联接函数:用于对多个表进行联接操作,包括join、crossJoin、union等。
```python
# 创建两个DataFrame
df1 = spark.createDataFrame([(1, "John"), (2, "Mike"), (3, "David")], ["id", "name"])
df2 = spark.createDataFrame([(1, "IT"), (2, "HR"), (3, "Finance")], ["id", "department"])
# 内连接df1和df2,并根据id进行联接
df1.join(df2, "id").show()
# 对df1和df2进行笛卡尔积
df1.crossJoin(df2).show()
# 将df1和df2进行union操作
df1.union(df2).show()
```
3. 集合函数:用于对数据集进行集合操作,包括distinct、union、intersect、except等。
```python
# 创建两个DataFrame
df1 = spark.createDataFrame([(1, "John"), (2, "Mike"), (3, "David")], ["id", "name"])
df2 = spark.createDataFrame([(3, "David"), (4, "Lisa"), (5, "Tom")], ["id", "name"])
# 对df1进行去重操作
df1.distinct().show()
# 将df1和df2进行union操作
df1.union(df2).show()
# 获取df1和df2的交集
df1.intersect(df2).show()
# 获取df1和df2的差集
df1.exceptAll(df2).show()
```
4. 复合函数:用于对数据进行复合操作,包括struct、array、map等。
```python
from pyspark.sql.functions import struct, array, map_from_arrays
# 将多个列合并成一个struct类型的列
df.select(struct("name", "age", "salary").alias("info")).show()
# 将多个列合并成一个array类型的列
df.select(array("name", "age", "salary").alias("info")).show()
# 将两个数组合并成一个map类型的列
df.select(map_from_arrays(array("key1", "key2"), array("value1", "value2")).alias("info")).show()
```