y2k*_*ham 6 partitioning dataframe apache-spark apache-spark-sql
考虑的方法(Spark 2.2.1):
DataFrame.repartition(带partitionExprs: Column*参数的两个实现)DataFrameWriter.partitionBy从文档的partitionBy:
如果指定,输出奠定了类似文件系统
Hive的分区方案.例如,当我们Dataset按年和月分区时,目录布局如下所示:
- 年= 2016 /月= 01 /
- 年= 2016 /月= 02 /
由此,我推断列参数的顺序将决定目录布局; 因此它是相关的.
从文档的repartition:
返回
Dataset由给定分区表达式分区的新分区,使用spark.sql.shuffle.partitions分区数.结果Dataset是散列分区.
根据我目前的理解,repartition决定处理时的并行度DataFrame.有了这个定义,行为repartition(numPartitions: Int)很简单,但是对于参数的另外两个实现也是repartition如此partitionExprs: Column*.
所有事情都说,我的疑虑如下:
partitionBy方法一样,列输入的顺序也与方法相关repartition吗?SQL与查询GROUP BY在相同的列?repartition(columnExprs: Column*)方法的行为numPartitions: Int和partitionExprs: Column*论证的相关性是什么repartition?这两种方法之间唯一的相似之处是它们的名称.有不同的东西,有不同的机制,所以你不应该比较它们.
话虽如此,repartition使用以下方式对数据进行洗牌:
partitionExprs它在表达式中使用的列上使用散列分区器spark.sql.shuffle.partitions.partitionExprs和numPartitions它一样,与前一个相同,但重写spark.sql.shuffle.partitions.numPartitions它只需重新排列数据RoundRobinPartitioning.在重新分区方法中列输入的顺序也是如此?
它是.hash((x, y))通常不一样hash((y, x)).
df = (spark.range(5, numPartitions=4).toDF("x")
.selectExpr("cast(x as string)")
.crossJoin(spark.range(5, numPartitions=4).toDF("y")))
df.repartition(4, "y", "x").rdd.glom().map(len).collect()
Run Code Online (Sandbox Code Playgroud)
[8, 6, 9, 2]
Run Code Online (Sandbox Code Playgroud)
df.repartition(4, "x", "y").rdd.glom().map(len).collect()
Run Code Online (Sandbox Code Playgroud)
[6, 4, 3, 12]
Run Code Online (Sandbox Code Playgroud)
如果我们在相同的列上运行带有GROUP BY的SQL查询,那么为并行执行提取的每个块是否包含与每个组中相同的数据?
取决于具体问题.
GROUP BY使用相同的列集将导致密钥在分区上的逻辑分布相同.GROUP BY"看到"只有实际的群体.| 归档时间: |
|
| 查看次数: |
4808 次 |
| 最近记录: |