Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark重新分区未按预期工作_Apache Spark_Apache Spark Sql_Datastax_Parquet - Fatal编程技术网

Apache spark Spark重新分区未按预期工作

Apache spark Spark重新分区未按预期工作,apache-spark,apache-spark-sql,datastax,parquet,Apache Spark,Apache Spark Sql,Datastax,Parquet,我使用的是spark sql 2.3.1,我设置了 spark.sql.shuffle.partitions=40 在我的代码中' val partitioned_df = vals_df.repartition(col("model_id"),col("fiscal_year"),col("fiscal_quarter")) 当我说 println(" Number of partitions : " + partitioned_df.rdd.getNumPartitions) 它给

我使用的是spark sql 2.3.1,我设置了

spark.sql.shuffle.partitions=40 
在我的代码中'

val partitioned_df =  vals_df.repartition(col("model_id"),col("fiscal_year"),col("fiscal_quarter"))
当我说

println(" Number of partitions : " + partitioned_df.rdd.getNumPartitions)
它给出40作为输出,实际上在重新分区后,理想情况下计数应该在400左右,为什么重新分区在这里不起作用?我做错了什么?如何修复它?

这是意料之中的,说明:

返回按给定分区划分的新数据集 表达式,使用spark.sql.shuffle.partitions作为 分区。生成的数据集是散列分区的

也许你对重新划分的理解是错误的。当您按列
c
重新分区时,则
c
具有相同值的所有行都位于同一分区中,但一个分区可以容纳多个
c

set spark.sql.shuffle.partitions=40
我的理解是,这仅适用于联接和聚合

试着这样做-我自己的例子:

val df2 = df.repartition(40, $"c1", $"c2")
下面是

val df2 = df.repartition(40, $"c1", $"c2").explain 

== Physical Plan ==
Exchange hashpartitioning(c1#114, c2#115, 40)
...
可以动态设置num分区:

n = some calculation
val df2 = df.repartition(n, $"c1", $"c2").explain 

为什么您希望有400个分区,而不是您要求的40个?理想的重新分区是什么意思?如果你对这个线程有什么看法,我感兴趣的可能是重复的。重新分区是RDD/spark的api,而不是scala,你为什么要引用scaladoc?“由给定分区表达式划分的数据集”从这里可以看出,我的分区表达式应该是什么,如果我想基于三列进行分区,即col(“model_id”)、col(“fiscal_year”)、col(“fiscal_quarter”)?因此,如果我想实现具有相同c值的行在同一分区中,并且该分区中不包含其他值,我怎么做?i、 e.一个分区用于一个键的值。@user3252097您不能对数据帧/数据集执行此操作,使用RDD ist应该是可能的(使用自定义分区器)。但是你想这样做吗,对我来说听起来很奇怪@Raphael Roth,我的目标是在所有分区中均匀分布数据。我的公司从20年前就有了数据,因为它在不断增长,数据也在不断增长。数据按年度和季度存储在表中。如果我按“年”、“季度”划分,一些分区有几百条记录,最近几年每个季度只有几百万条记录,所以当我按上述划分时,数据并不是均匀分布在所有分区中。如何使数据均匀分布在所有拼花地板文件或分区中?请告诉我,我应该如何以及遵循什么逻辑?一个基本的dobut,这里df被40分割,那么$“c1”和$“c2”扮演什么角色呢。。。在我的机器中,“$”没有被识别,但是“col”正在被识别,所以如果“$”需要被识别怎么办?我不确定你的观点,我只是从你的线程中跟随你的线索。那么,我注意到-3,你在facf中关心什么?可能我们没有抓住重点。我正在尝试将df2数据保存到Cassandra 3节点集群,即val df2=df.repartition(40),Cassandra并发线程无法写入这么多数据,因此我想将其重新分区到更小的块中,…我不能像40一样有固定数量的分区,明天我的df2记录可能会更少,所以我尝试基于$“c1”列和$“c2”列进行动态分区,怎么做?对我来说很有效,所以我有点惊讶。c1和c2是我使用的任意列名,如果您导入了import org.apache.spark.sql.functions.uu或implicits,请查看val df3=df.repartition(40,col(“c1”)、col(“c2”))是否也有效。您可以尝试一下,但我现在实际上进入了一个平面。您设置的重新分区和值是键。当您没有显式设置时,大多数情况都适用。祝你好运