sparkSQL基本使用

130 阅读2分钟

1. 环境准备

在使用 SparkSQL 之前,需要确保已经安装了 Apache Spark,并且配置了 Spark 环境。可以通过以下命令启动 Spark Shell 来进行交互式操作:

bash

复制

spark-shell

2. DataFrame 的创建

DataFrame 是 SparkSQL 的核心数据结构,类似于传统数据库中的表。可以通过以下几种方式创建 DataFrame:

(1)从文件中加载

scala

复制

val df = spark.read.json("path/to/jsonfile.json") // 从 JSON 文件加载
val df = spark.read.csv("path/to/csvfile.csv")   // 从 CSV 文件加载
val df = spark.read.parquet("path/to/parquetfile.parquet") // 从 Parquet 文件加载

(2)从现有 RDD 转换

scala

复制

val rdd = sc.parallelize(Seq((1, "Alice"), (2, "Bob")))
val df = rdd.toDF("id", "name")

(3)从 Hive 表加载

如果启用了 Hive 支持,可以直接从 Hive 表加载数据:

scala

复制

val df = spark.table("my_hive_table")

3. 查看 DataFrame

scala

复制

df.show() // 显示 DataFrame 的前 20 行
df.printSchema() // 打印 DataFrame 的 Schema
df.describe().show() // 显示数据的统计信息

4. 使用 SparkSQL 查询

可以通过 createOrReplaceTempView 方法将 DataFrame 注册为临时视图,然后使用 SQL 语法进行查询。

(1)注册视图

scala

复制

df.createOrReplaceTempView("my_table")

(2)执行 SQL 查询

scala

复制

val result = spark.sql("SELECT * FROM my_table WHERE id > 1")
result.show()

5. DataFrame API 操作

除了 SQL 查询,还可以直接使用 DataFrame API 进行操作:

(1)选择列

scala

复制

df.select("id", "name").show()

(2)过滤数据

scala

复制

df.filter($"id" > 1).show()

(3)分组聚合

scala

复制

df.groupBy("id").count().show()

(4)排序

scala

复制

df.orderBy($"id".desc).show()

6. 保存结果

查询结果可以保存到不同的文件格式中:

scala

复制

result.write.json("path/to/output.json")
result.write.csv("path/to/output.csv")
result.write.parquet("path/to/output.parquet")

7. 使用 Hive

如果需要使用 Hive 的功能,需要在启动 Spark 时启用 Hive 支持:

bash

复制

spark-shell --enable-hive-support

然后可以直接操作 Hive 表:

scala

复制

spark.sql("CREATE TABLE my_table (id INT, name STRING)")
spark.sql("INSERT INTO my_table VALUES (1, 'Alice'), (2, 'Bob')")

8. 性能优化

  • 缓存数据:对于频繁访问的数据,可以使用 df.cache()df.persist()
  • 调整分区:通过 repartition()coalesce() 调整分区数量。
  • 使用广播变量:对于小表,可以在连接操作中使用广播变量。

总结

SparkSQL 提供了强大的功能,既可以使用 SQL 语法进行查询,也可以通过 DataFrame API 进行操作。它支持多种数据源的读写,并且可以与 Hive 无缝集成,非常适合处理大规模结构化数据。