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

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

相关推荐
howard20051 小时前
大数据时代:历史、发展与未来
大数据
翔云API1 小时前
人证合一接口:智能化身份认证的最佳选择
大数据·开发语言·node.js·ocr·php
知识分享小能手1 小时前
mysql学习教程,从入门到精通,SQL 删除数据(DELETE 语句)(19)
大数据·开发语言·数据库·sql·学习·mysql·数据开发
学习使我快乐——玉祥2 小时前
es查询语法
大数据·elasticsearch·搜索引擎
哈尔滨财富通科技2 小时前
财富通公司开发维修售后小程序,解决售后维修问题
大数据·小程序·云计算·售后小程序·哈尔滨小程序
@月落3 小时前
alibaba获得店铺的所有商品 API接口
java·大数据·数据库·人工智能·学习
码爸4 小时前
spark读mongodb
大数据·mongodb·spark
WPG大大通4 小时前
有奖直播 | onsemi IPM 助力汽车电气革命及电子化时代冷热管理
大数据·人工智能·汽车·方案·电气·大大通·研讨会
ws2019074 小时前
抓机遇,促发展——2025第十二届广州国际汽车零部件加工技术及汽车模具展览会
大数据·人工智能·汽车
Data-Miner5 小时前
196页满分PPT | 集团流程优化及IT规划项目案例
大数据·数据分析