返回

Spark经典SQL50题

后端

使用 Apache Spark SQL 轻松查询学生生日

了解 Spark DataFrame

在踏上查询学生生日的旅程之前,让我们先建立一个存放生日数据的 Spark DataFrame。Spark SQL 的 createDataFrame() 函数会派上用场。

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types.{StructField, StructType, StringType}

val spark = SparkSession.builder().appName("Spark SQL Birthday Query").getOrCreate()

val schema = StructType(Array(
  StructField("name", StringType, true),
  StructField("birthday", StringType, true)
))

val df = spark.read.option("header", true).schema(schema).csv("students.csv")

df.show()

找出本周寿星

让我们用 Spark SQL 的 where() 函数来照亮本周过生日的学生。

val startOfWeek = LocalDate.now().with(DayOfWeek.MONDAY)
val endOfWeek = startOfWeek.plusDays(6)

val dfThisWeek = df.where($"birthday" >= startOfWeek.toString).where($"birthday" <= endOfWeek.toString)

dfThisWeek.show()

寻找下周的寿星

遵循相同的套路,让我们找到下周过生日的学生。

val startOfNextWeek = endOfWeek.plusDays(1)
val endOfNextWeek = startOfNextWeek.plusDays(6)

val dfNextWeek = df.where($"birthday" >= startOfNextWeek.toString).where($"birthday" <= endOfNextWeek.toString)

dfNextWeek.show()

识别本月寿星

现在,让我们使用 Spark SQL 的 month() 函数来查找本月过生日的学生。

val month = LocalDate.now().getMonthValue

val dfThisMonth = df.where($"month(birthday)" === month)

dfThisMonth.show()

下月寿星在哪里?

最后,我们使用相同的 month() 函数来找出下月过生日的学生。

val nextMonth = LocalDate.now().plusMonths(1).getMonthValue

val dfNextMonth = df.where($"month(birthday)" === nextMonth)

dfNextMonth.show()

总结

通过几个简单的示例,我们掌握了使用 Spark SQL 查询学生生日数据的技巧。这些查询让找出本周、下周、本月和下月的寿星变得轻而易举,这样我们就可以提前送上生日祝福。

常见问题解答

  • 问:我可以在查询中指定年份吗?
    答:当然可以!只需在 where 子句中添加 year(birthday) === <年> 即可。

  • 问:我可以按名称或生日范围进行过滤吗?
    答:没问题!使用 andor 操作符组合多个 where 子句即可。

  • 问:我可以从查询中排除某些学生吗?
    答:使用 not 操作符来否定 where 子句。

  • 问:我可以将查询结果导出到 CSV 文件吗?
    答:当然可以!使用 df.write.csv("path/to/file.csv") 即可。

  • 问:可以在查询中使用正则表达式吗?
    答:可以的!使用 rlike 函数来匹配正则表达式。