SparkSQL中的内置函数和高级函数和用法举例(Python)

38 篇文章 1 订阅
26 篇文章 0 订阅

一、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()
```

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,我们来举一个简单的例子来讲解Python的关键字参数和位置参数。 假设我们要定义一个函数,用来计算矩形面积。这个函数需要接收两个参数,分别是矩形的长和宽。我们可以这样定义这个函数: ```python def area(length, width): return length * width ``` 这里的`length`和`width`是位置参数,因为它们的传参是按照位置顺序来进行匹配的。例如,如果我们要计算一个长为3,宽为4的矩形面积,我们可以这样调用这个函数: ```python result = area(3, 4) print(result) # 12 ``` 这里的`3`和`4`就是位置参数,因为它们的传参顺序与函数定义的顺序是一致的。 除了位置参数外,Python还支持关键字参数。关键字参数是指在传递参数时,通过指定参数名来进行匹配的参数。例如,我们可以这样调用上面的函数: ```python result = area(length=3, width=4) print(result) # 12 ``` 这里的`length=3`和`width=4`就是关键字参数,因为它们是通过参数名来进行匹配的,而不是通过位置顺序。在使用关键字参数时,参数的顺序是可以任意调整的,例如: ```python result = area(width=4, length=3) print(result) # 12 ``` 在这个例子,参数的顺序与函数定义的顺序是不一致的,但是 Python 会根据参数名来进行匹配,从而得到正确的结果。 总之,Python的关键字参数和位置参数都是用于传递函数参数的方式,二者有不同的使用场景和优缺点,需要根据具体情况来选择使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据海中游泳的鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值