返回
Spark经典SQL50题
后端
2024-01-24 13:14:51
使用 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) === <年>
即可。 -
问:我可以按名称或生日范围进行过滤吗?
答:没问题!使用and
或or
操作符组合多个where
子句即可。 -
问:我可以从查询中排除某些学生吗?
答:使用not
操作符来否定where
子句。 -
问:我可以将查询结果导出到 CSV 文件吗?
答:当然可以!使用df.write.csv("path/to/file.csv")
即可。 -
问:可以在查询中使用正则表达式吗?
答:可以的!使用rlike
函数来匹配正则表达式。