升级 PySpark ¶
从 PySpark 3.3 升级到 3.4 ¶
-
在 Spark 3.4 中,数组列的模式通过合并数组中所有元素的模式来推断。要恢复之前仅从第一个元素推断模式的行为,可以将
spark.sql.pyspark.legacy.inferArrayTypeFromFirstElement.enabled
设置为true
。 -
在 Spark 3.4 中,如果 Pandas on Spark API
Groupby.apply
的func
参数返回类型未指定且compute.shortcut_limit
设置为 0,则采样行将设置为 2(确保采样行始终 >= 2),以确保模式推断准确。 -
在 Spark 3.4 中,如果 Pandas on Spark API
Index.insert
超出边界,将引发 IndexError,错误信息为index {} is out of bounds for axis 0 with size {}
,以遵循 pandas 1.4 的行为。 -
在 Spark 3.4 中,系列名称将在 Pandas on Spark API
Series.mode
中被保留,以遵循 pandas 1.4 的行为。 -
在 Spark 3.4 中,Pandas on Spark API
Index.__setitem__
首先会检查value
类型是否为Column
类型,以避免在is_list_like
中引发意外的ValueError
,例如 无法将列转换为布尔值:请在构建 DataFrame 布尔表达式时使用‘&’代表‘and’,‘|’代表‘or’,‘~’代表‘not’。 -
在 Spark 3.4 中,Pandas on Spark API
astype('category')
还将根据原始数据dtype
更新categories.dtype
,以遵循 pandas 1.4 的行为。 -
在 Spark 3.4 中,Pandas on Spark API 支持在
GroupBy.head
和GroupBy.tail
中进行按位置分组索引,以遵循 pandas 1.4。负参数现在可以正确工作,并且产生相对于每组的开始和结束的范围,之前负参数返回空的 DataFrame。 -
在 Spark 3.4 中,Pandas on Spark 中
groupby.apply
的模式推断过程将首先推断 pandas 类型,以确保 pandasdtype
的准确性。 -
在 Spark 3.4 中,
Series.concat
的排序参数将被尊重,以遵循 pandas 1.4 的行为。 -
在 Spark 3.4 中,
DataFrame.__setitem__
将创建副本并替换现有数组,这不将被覆盖,以遵循 pandas 1.4 的行为。 -
在 Spark 3.4 中,
SparkSession.sql
和 Pandas on Spark APIsql
新增加了args
参数,提供了将命名参数绑定到其 SQL 字面值的功能。 -
在 Spark 3.4 中,Pandas API on Spark 遵循 pandas 2.0 的变化,某些 API 在 Spark 3.4 中被弃用或移除。有关更多详细信息,请参阅 [pandas 的发布说明]( https://pandas.pydata.org/docs/dev/whatsnew/ )。
-
在 Spark 3.4 中,
collections.namedtuple
的自定义猴子补丁已被移除,默认使用cloudpickle
。要恢复collections.namedtuple
相关序列化问题的先前行为,请将环境变量PYSPARK_ENABLE_NAMEDTUPLE_PATCH
设置为1
。
将 PySpark 从 3.2 升级到 3.3 ¶
-
在 Spark 3.3 中,
pyspark.pandas.sql
方法遵循 标准 Python 字符串格式化 。要恢复之前的行为,请将PYSPARK_PANDAS_SQL_LEGACY
环境变量设置为1
。 -
在 Spark 3.3 中,Spark DataFrame 上 pandas API 的
drop
方法支持通过index
删除行,并默认按索引而不是按列删除。 -
在 Spark 3.3 中,PySpark 升级了 Pandas 版本,新的最低要求版本从 0.23.2 改为 1.0.5。
-
在 Spark 3.3 中,SQL 数据类型的
repr
返回值已更改,以便在传递给eval
时返回具有相同值的对象。
从 PySpark 3.1 升级到 3.2 ¶
-
在 Spark 3.2 中,来自 sql、ml、spark_on_pandas 模块的 PySpark 方法在应用于不当类型的参数时会引发
TypeError
,而不是ValueError
。 -
在 Spark 3.2 中,Python UDF、pandas UDF 和 pandas 函数 API 的 traceback 默认被简化,没有来自内部 Python 工作线程的 traceback。在 Spark 3.1 或更早版本中,Python 工作线程的 traceback 会被打印出来。要恢复到 Spark 3.2 之前的行为,可以将
spark.sql.execution.pyspark.udf.simplifiedTraceback.enabled
设置为false
。 -
在 Spark 3.2 中,默认启用固定线程模式,以将每个 Python 线程映射到相应的 JVM 线程。之前,一个 JVM 线程可以被多个 Python 线程重用,这导致一个 JVM 线程本地被多个 Python 线程共享。还请注意,现在推荐将
pyspark.InheritableThread
或pyspark.inheritable_thread_target
一起使用,以便 Python 线程正确继承可继承的属性,如 JVM 线程中的本地属性,并避免潜在的资源泄漏问题。要恢复到 Spark 3.2 之前的行为,可以将PYSPARK_PIN_THREAD
环境变量设置为false
。
从 PySpark 2.4 升级到 3.0 ¶
-
在 Spark 3.0 中,PySpark 需要 pandas 版本 0.23.2 或更高版本才能使用与 pandas 相关的功能,例如
toPandas
、createDataFrame
来自 pandas DataFrame 等。 -
在 Spark 3.0 中,PySpark 需要 PyArrow 版本 0.12.1 或更高版本才能使用与 PyArrow 相关的功能,例如
pandas_udf
、toPandas
和createDataFrame
以及 “spark.sql.execution.arrow.enabled=true” 等。 -
在 PySpark 中,当使用
SparkSession
创建SparkSession.builder.getOrCreate()
时,如果存在现有的SparkContext
,构建器将试图用指定给构建器的配置更新现有SparkContext
的SparkConf
,但SparkContext
是所有SparkSession
共享的,因此我们不应更新它们。在 3.0 中,构建器不再更新配置。这与 2.3 及以上版本的 Java/Scala API 的行为相同。如果您希望更新它们,则需要在创建SparkSession
之前更新它们。 -
在 PySpark 中,当启用 Arrow 优化时,如果 Arrow 版本高于 0.11.0,Arrow 可以在序列化期间执行安全的类型转换,将 pandas.Series 转换为 Arrow 数组。当检测到不安全的类型转换(如溢出)时,Arrow 会引发错误。您可以通过将
spark.sql.execution.pandas.convertToArrowArraySafely
设置为 true 来启用它。默认设置为 false。PySpark 对于 Arrow 版本的行为在下表中说明:PyArrow 版本
整数溢出
浮点截断
0.11.0 及以下
引发错误
默默允许
> 0.11.0, arrowSafeTypeConversion=false
默默溢出
默默允许
> 0.11.0, arrowSafeTypeConversion=true
引发错误
引发错误
-
在 Spark 3.0 中,
createDataFrame(..., verifySchema=True)
还会验证 PySpark 中的 LongType。以前 LongType 不会被验证,并且在值溢出时结果为 None。要恢复此行为,可以将 verifySchema 设置为 False 来禁用验证。 -
截至 Spark 3.0,当使用命名参数构造
Row
字段名时,不再按字母顺序排序,对于 Python 版本 3.6 及以上,字段的顺序将与输入的顺序相符。要在默认情况下按顺序排序字段,如同 Spark 2.4,可以将环境变量PYSPARK_ROW_FIELD_SORTING_ENABLED
设置为 true,适用于执行器和驱动程序 - 此环境变量必须在所有执行器和驱动程序上一致;否则,可能会导致失败或不正确的结果。对于 Python 版本低于 3.6,字段名将按字母顺序排序,作为唯一选项。 -
在 Spark 3.0 中,
pyspark.ml.param.shared.Has*
混合类不再提供任何set*(self, value)
设置方法,请改用相应的self.set(self.*, value)
。有关详细信息,请参见 SPARK-29093 。
从 PySpark 2.3 升级到 2.4 ¶
-
在PySpark中,当启用Arrow优化时,之前
toPandas
仅在无法使用Arrow优化时失败,而createDataFrame
从Pandas DataFrame允许回退到非优化。现在,toPandas
和createDataFrame
从Pandas DataFrame 默认都允许回退,可以通过spark.sql.execution.arrow.fallback.enabled
关闭。
从 PySpark 2.3.0 升级到 2.3.1 及以上版本 ¶
-
截至版本 2.3.1,Arrow 功能,包括
pandas_udf
和toPandas()
/createDataFrame()
,在spark.sql.execution.arrow.enabled
设置为True
时,被标记为实验性。这些功能仍在不断发展,目前不建议在生产环境中使用。
从 PySpark 2.2 升级到 2.3 ¶
-
在 PySpark 中,如果您想使用与 Pandas 相关的功能,例如
toPandas
、createDataFrame
从 Pandas DataFrame,您需要 Pandas 0.19.2 或更高版本。 -
在 PySpark 中,与 Pandas 相关功能的时间戳值行为已更改,以尊重会话时区。如果您想使用旧的行为,您需要将配置
spark.sql.execution.pandas.respectSessionTimeZone
设置为 False。有关详细信息,请参见 SPARK-22395 。 -
在 PySpark 中,
na.fill()
或fillna
也接受布尔值,并用布尔值替换 null。在之前的 Spark 版本中,PySpark 会忽略它并返回原始数据集/DataFrame。 -
在 PySpark 中,
df.replace
在to_replace
不是字典时不允许省略值。之前,在其他情况下,值可以省略,默认值为 None,这很反直觉且容易出错。
从 PySpark 1.4 升级到 1.5 ¶
-
在Python中,将字符串解析为列现在支持使用点 (.) 来限定列或访问嵌套值。例如
df['table.column.nestedField']
。然而,这意味着如果您的列名包含任何点,您现在必须使用反引号进行转义(例如,table.`column.with.dots`.nested
)。 -
PySpark 中的 DataFrame.withColumn 方法支持添加新列或替换同名的现有列。
从 PySpark 1.0-1.2 升级到 1.3 ¶
-
在Python中使用DataTypes时,您需要构造它们(即
StringType()
),而不是引用单例。