升级 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 类型,以确保 pandas dtype 的准确性。

  • 在 Spark 3.4 中, Series.concat 的排序参数将被尊重,以遵循 pandas 1.4 的行为。

  • 在 Spark 3.4 中, DataFrame.__setitem__ 将创建副本并替换现有数组,这不将被覆盖,以遵循 pandas 1.4 的行为。

  • 在 Spark 3.4 中, SparkSession.sql 和 Pandas on Spark API sql 新增加了 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() ),而不是引用单例。