Apache spark Pyspark重新分区行为

Apache spark Pyspark重新分区行为,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我试图理解SQL上下文中的repartition()行为。我有一个数据框,有178行。其中一个列是与数据相关的唯一id。在我的数据框中,我知道每个唯一Id有2行 我希望能够控制我得到的每个分区中的记录数。在我的例子中,我希望有89个分区,其中有2条记录 根据文件() 我正在做以下工作: df = spark.read \ .parquet("my_data_path") \ .repartition(89, "Id") .withColumn('

我试图理解SQL上下文中的
repartition()
行为。我有一个数据框,有178行。其中一个列是与数据相关的唯一id。在我的数据框中,我知道每个唯一Id有2行

我希望能够控制我得到的每个分区中的记录数。在我的例子中,我希望有89个分区,其中有2条记录

根据文件() 我正在做以下工作:

df = spark.read \
        .parquet("my_data_path") \
        .repartition(89, "Id") 
        .withColumn('result_col', some_udf("data"))

df.persist()

df.write.format("org.elasticsearch.spark.sql").mode('append').save()

但是回到斯巴库伊,在运行作业时,我可以看到重新分区是不好的

因此,我对带有列的重新分区的理解有些错误。我试图给我的
Id
专栏添加一些盐,但没有任何变化。我的问题是如何控制每个分区的记录数,以及是否可以使用
repartition()


感谢所有找到解决方案的人,为寻找解决方案的人提供帮助

解决方案是让SQL上下文使用RDD函数:


df = spark.read \
        .parquet("my_data_path") \

# We create a window in order to add index to our rows
w = Window.orderBy("random_field_sort")

# Add index
df = df.withColumn("index", row_number().over(w) % my_repartition_value))

schema = df.schema

# Use your index as Key in order to create a RDD of Key;Value
df = df.rdd.map(lambda x: (x["index"], (x)))

# The main point for the repartiton with the partitionBy 
# & revert back the structur of the data
rdd = df.partitionBy(my_repartition_value).map(lambda x: x[1])

# Good to go
df = spark.createDataFrame(rdd, schema)

df = df.withColumn('result_col', some_udf("data"))

df.persist()

df.write.format("org.elasticsearch.spark.sql").mode('append').save()


嗯,你的意思是我得到的是这种情况:
Hash partitioner既不是内射的也不是满射的。可以将多个键分配给单个分区,某些分区可以保持为空。
?您不需要按任何键重新分区,只需给出一个数字,其余的将为您处理。已尝试此操作,但结果导致重新分区不正确,我的目标实际上是控制每个分区中记录的数量。哈希分区器不会这样做。您可以使用自定义分区器来实现这一点,在该分区器中,您可以控制每个键分配到的分区,并且该分区仅适用于RDDAFAIK。