我知道rdd是使用hashpartitioner基于键值进行分区的。但是sparkDataframe在默认情况下是如何分区的,因为它没有键/值的概念。
zxlwwiss1#
Dataframe的分区方式取决于它的创建方式。没有应用“默认”分区逻辑。下面是一些如何设置分区的示例:通过以下方式创建的Dataframe val df = Seq(1 to 500000: _*).toDF() 只有一个分区。从rdd派生的Dataframe( spark.createDataFrame(rdd, schema) )将具有与基础rdd相同数量的分区。在我的例子中,由于本地有6个内核,所以rdd是用6个分区创建的。从kafka主题消费的Dataframe将具有与该主题的分区匹配的分区数量。通过读取文件(例如从hdfs读取文件)创建的Dataframe将具有与文件的分区数量相匹配的分区数量。从需要洗牌的转换派生的Dataframe将具有由 spark.sql.shuffle.partitions (默认为200)。...rdd和结构化api之间的一个主要区别是,您对分区的控制不如rdd,rdd甚至可以定义自定义分区器。这对于Dataframe是不可能的。
val df = Seq(1 to 500000: _*).toDF()
spark.createDataFrame(rdd, schema)
spark.sql.shuffle.partitions
1条答案
按热度按时间zxlwwiss1#
Dataframe的分区方式取决于它的创建方式。
没有应用“默认”分区逻辑。下面是一些如何设置分区的示例:
通过以下方式创建的Dataframe
val df = Seq(1 to 500000: _*).toDF()
只有一个分区。从rdd派生的Dataframe(
spark.createDataFrame(rdd, schema)
)将具有与基础rdd相同数量的分区。在我的例子中,由于本地有6个内核,所以rdd是用6个分区创建的。从kafka主题消费的Dataframe将具有与该主题的分区匹配的分区数量。
通过读取文件(例如从hdfs读取文件)创建的Dataframe将具有与文件的分区数量相匹配的分区数量。
从需要洗牌的转换派生的Dataframe将具有由
spark.sql.shuffle.partitions
(默认为200)。...
rdd和结构化api之间的一个主要区别是,您对分区的控制不如rdd,rdd甚至可以定义自定义分区器。这对于Dataframe是不可能的。