[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 的不同值再进行子目录的划分。

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

相关推荐
️公子42 分钟前
线束组装与测试技术
大数据·线束·线束总成
黎阳之光1 小时前
黎阳之光:以视频孪生重构智能监盘,为燃机打造新一代智慧电厂大脑
大数据·人工智能·算法·安全·数字孪生
Lalolander2 小时前
设备工程项目采购中缺料和浪费的痛点和解决思路
大数据·运维·设备工程项目管理系统·设备工程项目质量管控·设备工程项目成本管控
拉卡拉开放平台3 小时前
支付系统在文旅场景的进阶之路:聚合收单、分账与自动化对账
大数据·人工智能·自动化
互联网推荐官3 小时前
2026上海GEO优化服务商综合实力深度评测
大数据·人工智能·技术分享·geo·上海
QYR_114 小时前
4.3% 年复合增速:2026全球救生衣灯市场格局与海事合规发展报告
大数据·人工智能
铭毅天下4 小时前
Easysearch 版本进化全图——从 ES 国产替代到 AI Native 搜索数据库
大数据·数据库·人工智能·elasticsearch·搜索引擎
ZGi.ai4 小时前
采购部门用AI审供应商资质:从3天压缩到3小时的方案
大数据·人工智能·rag·供应商管理·企业ai·文档审核·采购ai
Miss roro5 小时前
法律科技的发展脉络:从数字化管理到AI辅助办案的演进路径
大数据·人工智能·科技·法律科技·律所管理系统·案件管理系统