Apache spark 默认情况下,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)。另外,请参见下面关于

我知道RDD是使用HashPartitioner基于键值进行分区的。但是默认情况下,Spark数据帧是如何分区的,因为它没有键/值的概念。

数据帧的分区取决于创建它所运行的任务的数量

没有应用“默认”分区逻辑。下面是一些如何设置分区的示例:

  • 通过
    val df=Seq(1到500000:*)创建的数据帧。toDF()
    将只有一个分区
  • 通过
    val df=spark.range(0100).toDF()
    创建的数据帧的分区数与可用内核数相同(例如,当主控设置为
    local[4]
    时为4)。另外,请参见下面关于“默认并行性”的注释,该注释对无父RDD的
    parallelize
    等操作生效
  • 从RDD(
    spark.createDataFrame(RDD,schema)
    )派生的数据帧将具有与基础RDD相同的分区数量。在我的例子中,由于我在本地有6个内核,所以RDD是用6个分区创建的
  • 从Kafka主题消费的数据帧将具有与该主题的分区相匹配的分区数量,因为它可以使用与该主题具有分区相同数量的核心/插槽来消费该主题
  • 通过读取文件(例如从HDFS读取文件)创建的数据帧将具有与文件匹配的分区数量,除非单个文件必须基于默认为128MB的
    spark.sql.files.maxPartitionBytes
    拆分为多个分区
  • 从需要洗牌的转换派生的数据帧将具有由
    spark.sql.shuffle.partitions
    (默认情况下为200)设置的可配置分区数量
RDD和结构化API之间的主要区别之一是,您对分区的控制不如RDD,RDD甚至可以定义自定义分区器。这在数据帧中是不可能的

默认并行性 配置
spark.default.parallelism
的文档说明:

对于无父RDD的并行化等操作,它取决于群集管理器:

本地模式:本地计算机上的磁芯数

细晶模式:8

其他:所有执行器节点上的内核总数或2个,以较大者为准