[spark] 存储到hdfs时指定分区

在 SparkSQL 中指定多个分区字段进行数据存储:

类似hive 分区存储

文章目录

代码

scala 复制代码
import org.apache.spark.sql.SparkSession

val spark = SparkSession.builder()
  .appName("MultiPartitionedWriteExample")
  .getOrCreate()

// 假设你有一个 DataFrame 叫做 data,包含了需要存储的数据
val data = spark.read.json("hdfs://path_to_your_data/data.json")

// 使用 partitionBy() 方法将数据按照多个字段的不同值进行分区存储
data.write
  .partitionBy("partition_column1", "partition_column2")
  .format("parquet")  // 指定数据格式,比如 Parquet
  .save("hdfs://path_to_save_data/")

在上述代码中,partitionBy("partition_column1", "partition_column2") 指定了要根据多个字段进行分区存储。

这样,数据就会根据字段 partition_column1partition_column2 的不同值被存储到不同的目录中。

示例

假设你有如下一个数据表 employees

id name department salary
1 Alice HR 50000
2 Bob IT 60000
3 Charlie IT 55000
4 David Marketing 45000
5 Eve Marketing 70000

现在,假设你想要按照 departmentsalary 两个字段进行分区存储到 HDFS 上,那么你可以使用以下代码:

scala 复制代码
import org.apache.spark.sql.SparkSession

val spark = SparkSession.builder()
  .appName("MultiPartitionedWriteExample")
  .getOrCreate()

val employees = Seq(
  (1, "Alice", "HR", 50000),
  (2, "Bob", "IT", 60000),
  (3, "Charlie", "IT", 55000),
  (4, "David", "Marketing", 45000),
  (5, "Eve", "Marketing", 70000)
).toDF("id", "name", "department", "salary")

employees.write
  .partitionBy("department", "salary")
  .format("parquet")
  .save("hdfs://path_to_save_data/employees")

通过上述代码,数据将被按照 departmentsalary 进行分区,最终存储在 HDFS 中的目录结构如下:

复制代码
hdfs://path_to_save_data/employees/
├── department=HR
│   ├── salary=50000
│   │   └── part-00000-x.snappy.parquet
│   └── _SUCCESS
├── department=IT
│   ├── salary=55000
│   │   └── part-00000-x.snappy.parquet
│   ├── salary=60000
│   │   └── part-00000-x.snappy.parquet
│   └── _SUCCESS
├── department=Marketing
│   ├── salary=45000
│   │   └── part-00000-x.snappy.parquet
│   ├── salary=70000
│   │   └── part-00000-x.snappy.parquet
│   └── _SUCCESS
└── _SUCCESS

在上述目录结构中,每个分区字段的值都会对应一个目录,其中包含了该分区值对应的数据文件。

例如,第一个分区字段是 department,那么数据将按照不同的部门名称存储到对应的目录下,每个部门目录下又会根据第二个分区字段 salary 的不同值再进行子目录的划分。

需要注意的是,对于大量的数据和分区字段,需要谨慎地选择分区字段,以免导致过多的小文件。

相关推荐
maray33 分钟前
对 Lambda 架构问题的深入理解
大数据·数据库·架构
夜影风1 小时前
关于数据仓库、数据湖、数据平台、数据中台和湖仓一体的概念和区别
大数据·数据仓库·spark
Blossom.1181 小时前
量子计算在金融科技中的应用前景
大数据·人工智能·安全·机器学习·计算机视觉·金融·量子计算
递归尽头是星辰1 小时前
ClickHouse核心优势分析与场景实战
大数据·数据仓库·clickhouse·实时分析·实时查询
胡尔摩斯.3 小时前
ElasticSearch操作
大数据·elasticsearch·jenkins
£菜鸟也有梦5 小时前
Spark入门秘籍
大数据·分布式·spark
斯普信专业组5 小时前
Elasticsearch生产环境性能调优指南
大数据·elasticsearch·搜索引擎
Leo.yuan6 小时前
ETL 代表什么?ETL 开发主要做什么?
大数据·数据库·数据仓库·数据分析·etl
多多洛码代码6 小时前
Flink概述
大数据·flink
lilye666 小时前
精益数据分析(70/126):MVP迭代中的数据驱动决策与功能取舍
大数据·人工智能·数据分析