spark更改分区_Spark DataFrame重新分区和Parquet分区

本文介绍了Spark中的分区策略,包括partitionBy用于逻辑组织数据和提高查询性能,bucketBy实现数据散列分布,以及repartition进行数据均衡。讨论了repartition与bucketBy的区别,并解释了在不同场景下如何选择合适的分区策略,如连接操作时关注的性能因素。
摘要由CSDN通过智能技术生成

你要问的几件事 - 分区,分区和数据 balancer ,

Partitioning:

分区数据通常用于水平分配负载,这具有性能优势,并有助于以逻辑方式组织数据 .

分区表会更改持久化数据的结构,现在将创建反映此分区结构的子目录 .

这可以显着提高查询性能,但前提是分区方案反映了常见的过滤 .

在Spark中,这由 df.write.partitionedBy(column*) 完成,并通过将 columns 分区到同一子目录中来分组数据 .

Bucketing:

Bucketing是另一种将数据集分解为更易于管理的部分的技术 . 根据提供的列,将整个数据散列到用户定义数量的存储区(文件)中 .

Hive的同义词 Distribute By

在Spark中,这由 df.write.bucketBy(n, column*) 完成,并通过将 columns 分区到同一文件中来分组数据 . 生成的文件数由 n 控制

Repartition:

它根据给定的分区表达式将一个新的 DataFrame 均衡地返回到给定数量的内部文件中 . 生成的DataFrame是散列分区的 .

Spark管理这些分区上的数据,这些数据有助于并行化分布式数据处理,只需最少的网络流量即可在 Actuator 之间发送数据 .

在Spark中,这由 df.repartition(n, column*) 完成,并通过将 columns 分区为相同的内部分区文件来对数据进行分组 . 请注意,没有数据持久存储到存储,这只是基于类似 bucketBy 的约束的数据内部 balancer

Tl;dr

1)我在列上使用重新分区将数据存储在镶木地板中 . 但我看到了没有 . 镶木地板分区文件与no不同 . Rdd分区 . rdd分区和镶木地板分区之间没有相关性吗?

重新分区与bucketBy没有partitionedBy的相关性 . 分区文件由 spark.sql.shuffle.partitions 和 spark.default.parallelism 等其他配置管理

2)当我将数据写入镶木地板分区并使用Rdd重新分区然后我从镶木地板分区读取数据时,在读/写期间rdd分区编号是否相同时是否有任何条件?

在读取时间内,分区数将等于 spark.default.parallelism

3)如何使用列id对数据帧进行分支,并通过相同的列ID重新分区数据帧?

类似工作,除了bucketing是一个写操作,用于持久化 .

4)在考虑Spark中的连接性能时,我们应该关注分组或重新分区(或者两者兼而有之)

两个数据集的

repartition 都在内存中,如果一个或两个数据集都是持久的,那么也请查看 bucketBy .

Spark SQL可以通过以下步骤解析查询Parquet格式的Hive表并获取分区字段和查询条件: 1. 首先,使用SparkSession对象创建一个DataFrame,该DataFrame将连接到Hive表并读取Parquet格式的数据。 2. 接下来,使用DataFrame的schema()方法获取表的模式,包括分区字段和非分区字段。 3. 使用DataFrame的filter()方法来应用查询条件,并使用where()方法来指定分区字段的值。 4. 最后,使用DataFrame的select()方法选择要返回的列,并使用show()方法显示结果。 示例代码如下: ``` from pyspark.sql import SparkSession # 创建SparkSession对象 spark = SparkSession.builder.appName("ParquetHiveTable").enableHiveSupport().getOrCreate() # 读取Hive表中的Parquet数据 df = spark.table("myhive.parquet_table") # 获取表的模式 schema = df.schema # 应用查询条件并指定分区字段的值 df_filtered = df.filter("column1 > 10").where("partition_column = '2022-01-01'") # 选择要返回的列并显示结果 df_filtered.select("column1", "column2").show() ``` 在上面的代码中,我们假设Parquet格式的Hive表名为“myhive.parquet_table”,其中包含一个名为“column1”的非分区字段和一个名为“partition_column”的分区字段。我们使用filter()方法应用查询条件“column1 > 10”,并使用where()方法指定分区字段的值为“2022-01-01”。最后,我们选择要返回的列“column1”和“column2”,并使用show()方法显示结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值