1. 启动 Spark Shell
Spark Shell 是一个交互式的 Scala 命令行工具,可以用来快速测试 Spark SQL 的功能。启动方法如下:
bash
复制
spark-shell
2. 创建 SparkSession
SparkSession 是 Spark SQL 的入口点,用于创建 DataFrame、注册表等操作。在 Spark Shell 中,spark 是默认的 SparkSession 对象,可以直接使用。如果在其他环境中,可以通过以下代码创建:
scala
复制
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder
.appName("Spark SQL basic example")
.config("spark.some.config.option", "some-value")
.getOrCreate()
3. 创建 DataFrame
DataFrame 是 Spark SQL 的核心数据结构,类似于关系数据库中的表。可以通过从文件加载数据、从现有 RDD 转换或直接定义数据来创建 DataFrame。
从文件加载数据
scala
复制
val df = spark.read.json("path/to/json/file.json")
支持的文件格式包括 JSON、CSV、Parquet 等。
从 RDD 转换
scala
复制
import spark.implicits._
val data = Seq((1, "Alice"), (2, "Bob"), (3, "Cathy"))
val rdd = spark.sparkContext.parallelize(data)
val df = rdd.toDF("id", "name")
直接定义数据
scala
复制
val data = Seq((1, "Alice"), (2, "Bob"), (3, "Cathy"))
val df = data.toDF("id", "name")
4. 查询 DataFrame
使用 DataFrame API
scala
复制
df.select("id", "name").show()
df.filter($"id" > 1).show()
df.groupBy("name").count().show()
使用 SQL 查询
scala
复制
df.createOrReplaceTempView("people") // 创建一个临时视图
spark.sql("SELECT * FROM people WHERE id > 1").show()
5. 数据保存
可以将 DataFrame 保存为文件,支持多种格式:
scala
复制
df.write.json("path/to/output/json")
df.write.csv("path/to/output/csv")
df.write.parquet("path/to/output/parquet")
6. 常见操作
数据类型转换
scala
复制
df.withColumn("id", $"id".cast("string")).show()
添加新列
scala
复制
df.withColumn("age", $"id" * 2).show()
数据排序
scala
复制
df.orderBy($"id".desc).show()
数据去重
scala
复制
df.dropDuplicates().show()
7. 关闭 SparkSession
在程序结束时,需要关闭 SparkSession:
scala
复制
spark.stop()
示例代码
以下是一个完整的示例代码:
scala
复制
import org.apache.spark.sql.SparkSession
object SparkSQLExample {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder
.appName("Spark SQL basic example")
.getOrCreate()
import spark.implicits._
val data = Seq((1, "Alice"), (2, "Bob"), (3, "Cathy"))
val df = data.toDF("id", "name")
df.createOrReplaceTempView("people")
spark.sql("SELECT * FROM people WHERE id > 1").show()
df.select("id", "name").show()
df.filter($"id" > 1).show()
df.groupBy("name").count().show()
spark.stop()
}
}
总结
Spark SQL 提供了强大的数据处理能力,结合了 SQL 的易用性和 Spark 的高性能。通过 DataFrame API 和 SQL 查询,可以轻松地对结构化数据进行操作和分析。