Apache spark 默认情况下,Spark数据帧是如何分区的?
我知道RDD是使用HashPartitioner基于键值进行分区的。但是默认情况下,Spark数据帧是如何分区的,因为它没有键/值的概念。数据帧的分区取决于创建它所运行的任务的数量 没有应用“默认”分区逻辑。下面是一些如何设置分区的示例:Apache spark 默认情况下,Spark数据帧是如何分区的?,apache-spark,apache-spark-sql,rdd,Apache Spark,Apache Spark Sql,Rdd,我知道RDD是使用HashPartitioner基于键值进行分区的。但是默认情况下,Spark数据帧是如何分区的,因为它没有键/值的概念。数据帧的分区取决于创建它所运行的任务的数量 没有应用“默认”分区逻辑。下面是一些如何设置分区的示例: 通过val df=Seq(1到500000:*)创建的数据帧。toDF()将只有一个分区 通过val df=spark.range(0100).toDF()创建的数据帧的分区数与可用内核数相同(例如,当主控设置为local[4]时为4)。另外,请参见下面关于
- 通过
将只有一个分区val df=Seq(1到500000:*)创建的数据帧。toDF()
- 通过
创建的数据帧的分区数与可用内核数相同(例如,当主控设置为val df=spark.range(0100).toDF()
时为4)。另外,请参见下面关于“默认并行性”的注释,该注释对无父RDD的local[4]
等操作生效parallelize
- 从RDD(
)派生的数据帧将具有与基础RDD相同的分区数量。在我的例子中,由于我在本地有6个内核,所以RDD是用6个分区创建的spark.createDataFrame(RDD,schema)
- 从Kafka主题消费的数据帧将具有与该主题的分区相匹配的分区数量,因为它可以使用与该主题具有分区相同数量的核心/插槽来消费该主题
- 通过读取文件(例如从HDFS读取文件)创建的数据帧将具有与文件匹配的分区数量,除非单个文件必须基于默认为128MB的
拆分为多个分区spark.sql.files.maxPartitionBytes
- 从需要洗牌的转换派生的数据帧将具有由
(默认情况下为200)设置的可配置分区数量spark.sql.shuffle.partitions
spark.default.parallelism
的文档说明:
对于无父RDD的并行化等操作,它取决于群集管理器:
本地模式:本地计算机上的磁芯数
细晶模式:8
其他:所有执行器节点上的内核总数或2个,以较大者为准