使用pyspark转换时在databricks和googlecolab上的不同结果

2024-06-30 17:24:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图进行数据转换,但在databricks和GoogleColab中使用pyspark时发现了不同的结果。 我基本上是将pysaprk数据帧从长格式转换为宽格式。以下面的方式

这是我的代码片段

from pyspark.sql.types import DoubleType
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('abc').getOrCreate()
df = spark.createDataFrame([1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0], DoubleType()).toDF("Number")
df.show()
>>
+------+
|Number|
+------+
|   1.0|
|   2.0|
|   3.0|
|   4.0|
|   5.0|
|   6.0|
|   7.0|
|   8.0|
|   9.0|
+------+

from pyspark.sql import functions as F, Window
from math import sqrt
c = int(sqrt(df.count())) #this gives 3
rnum = F.row_number().over(Window.orderBy(F.lit(1)))

out = (df.withColumn("Rnum",((rnum-1)%c).cast("Integer"))
 .withColumn("idx",F.row_number().over(Window.partitionBy("Rnum").orderBy("Rnum")))
.groupby("Rnum").pivot("idx").agg(F.first("Number")))

colab中out.show的输出如下所示。这是我需要的理想输出。 https://colab.research.google.com/drive/10Yuggohq3MmpckWgcJrc5w1Q8vu5jSEh#scrollTo=JxnQk51nEkJd

+----+---+---+---+
|Rnum|  1|  2|  3|
+----+---+---+---+
|   0|1.0|4.0|7.0|
|   1|2.0|5.0|8.0|
|   2|3.0|6.0|9.0|
+----+---+---+---+

在databricks中,我在生产集群上运行代码(64核| 224GB | DBR 7.0 | Spark 3.0.0),每次运行转换代码时,输出都是不同的。例如,其中一个实例out.show()的代码输出为:

+----+---+---+---+
|Rnum|  1|  2|  3|
+----+---+---+---+
|   0|3.0|7.0|1.0|
|   1|4.0|2.0|5.0|
|   2|8.0|6.0|9.0|
+----+---+---+---+

我如何确保每次转换完成时都在数据块中显示一致的输出


Tags: 数据代码fromimportnumberdfsql格式