Dataframe 重新分区更改Spark中数据帧的行顺序

Dataframe 重新分区更改Spark中数据帧的行顺序,dataframe,apache-spark,pyspark,partition,pyspark-dataframes,Dataframe,Apache Spark,Pyspark,Partition,Pyspark Dataframes,我想了解在应用.repartition函数后,我的数据帧发生了什么。如果我的原始数据帧是: +--------+------+--------------+-------+-----+ |integers|floats|integer_arrays|letters|nulls| +--------+------+--------------+-------+-----+ | 1| -1.0| [1, 2]| a| 1| | 2| 0.5

我想了解在应用.repartition函数后,我的数据帧发生了什么。如果我的原始数据帧是:

+--------+------+--------------+-------+-----+
|integers|floats|integer_arrays|letters|nulls|
+--------+------+--------------+-------+-----+
|       1|  -1.0|        [1, 2]|      a|    1|
|       2|   0.5|     [3, 4, 5]|      b| null|
|       3|   2.7|  [6, 7, 8, 9]|      c|    2|
+--------+------+--------------+-------+-----+
我跑:

df.repartition(10).show()
结果数据帧的行顺序不同:

+--------+------+--------------+-------+-----+
|integers|floats|integer_arrays|letters|nulls|
+--------+------+--------------+-------+-----+
|       3|   2.7|  [6, 7, 8, 9]|      c|    2|
|       2|   0.5|     [3, 4, 5]|      b| null|
|       1|  -1.0|        [1, 2]|      a|    1|
+--------+------+--------------+-------+-----+
为什么行的顺序会改变

对于一个包含3行并被拆分为10个分区的数据帧,实际发生了什么

我可以看到它分配的分区吗


感谢您的帮助。

您的初始数据帧的行分布在不同的分区上。当您调用
show
时,将从分区中获取行的子集并将其传递给驱动程序,然后驱动程序将以表格格式显示它们

要查看为您的行分配的分区,请使用pyspark sql函数
spark\u partition\u id()

现在,当您要求重新洗牌时,Spark将计算每一行的哈希值,并根据该值和洗牌操作中使用的默认分区数,将每一行移动到一个(可能不同的)分区,如下图所示:

>>> df2 = df1.repartition(10).withColumn("partition_id_after", spark_partition_id())
>>> df2.show()
+---+-------------------+------------------+
| id|partition_id_before|partition_id_after|
+---+-------------------+------------------+
|  2|                  3|                 5|
|  0|                  1|                 6|
|  1|                  2|                 9|
+---+-------------------+------------------+

通常,由于SCAP是分布式处理的框架,我的建议不是依赖于(感知)的行的顺序,并将数据文件的内容视为行(集合中缺少顺序的集合,如组理论)。像orderBy这样的函数通常只用于显示目的,例如从某个内容中获取前N个结果,然后顺序很重要。在大多数操作中,忽略顺序

>>> df2 = df1.repartition(10).withColumn("partition_id_after", spark_partition_id())
>>> df2.show()
+---+-------------------+------------------+
| id|partition_id_before|partition_id_after|
+---+-------------------+------------------+
|  2|                  3|                 5|
|  0|                  1|                 6|
|  1|                  2|                 9|
+---+-------------------+------------------+