pyspark.testing.assertDataFrameEqual

pyspark.testing. assertDataFrameEqual ( actual : Union [ pyspark.sql.dataframe.DataFrame , pandas.DataFrame , pyspark.pandas.DataFrame , List [ pyspark.sql.types.Row ] ] , expected : Union [ pyspark.sql.dataframe.DataFrame , pandas.DataFrame , pyspark.pandas.DataFrame , List [ pyspark.sql.types.Row ] ] , checkRowOrder : bool = False , rtol : float = 1e-05 , atol : float = 1e-08 ) [source]

一个用于断言 实际 预期 (DataFrame或Row列表)之间相等的实用函数,带有可选参数 检查行顺序 相对容差 绝对容差

支持 Spark、Spark Connect、pandas 和 pandas-on-Spark DataFrame。 有关 pandas-on-Spark DataFrame 相等性的更多信息,请参阅 assertPandasOnSparkEqual 的文档。

新增于版本 3.5.0。

Parameters
actual DataFrame (Spark, Spark Connect, pandas, or pandas-on-Spark) or list of Rows

正在比较或测试的DataFrame。

expected DataFrame (Spark, Spark Connect, pandas, or pandas-on-Spark) or list of Rows

操作的预期结果,用于与实际结果进行比较。

checkRowOrder bool, optional

一个标志,指示是否应在比较中考虑行的顺序。 如果设置为 False (默认),则不考虑行顺序。 如果设置为 True ,则行的顺序很重要,并在比较期间进行检查。 (见注释)

rtol float, optional

相对容差,用于在实际和预期中对浮点值断言近似相等。默认设置为1e-5。(参见注释)

atol float, optional

绝对容差,用于断言实际和预期浮点值之间的近似相等。默认设置为1e-8。(参见注释)

注释

assertDataFrameEqual 失败时,错误消息使用Python的 difflib 库来显示 actual expected 中每一行差异的差异日志。

对于 checkRowOrder ,请注意PySpark DataFrame的排序是非确定性的,除非明确排序。

请注意,仅当 预期 是DataFrame(而不是行的列表)时,才会检查模式相等性。

对于包含浮点值的DataFrame,assertDataFrame断言近似相等。 两个浮点值a和b在以下等式为真时近似相等:

absolute(a - b) <= (atol + rtol * absolute(b))

示例

>>> df1 = spark.createDataFrame(data=[("1", 1000), ("2", 3000)], schema=["id", "amount"])
>>> df2 = spark.createDataFrame(data=[("1", 1000), ("2", 3000)], schema=["id", "amount"])
>>> assertDataFrameEqual(df1, df2)  # pass, DataFrames are identical
>>> df1 = spark.createDataFrame(data=[("1", 0.1), ("2", 3.23)], schema=["id", "amount"])
>>> df2 = spark.createDataFrame(data=[("1", 0.109), ("2", 3.23)], schema=["id", "amount"])
>>> assertDataFrameEqual(df1, df2, rtol=1e-1)  # pass, DataFrames are approx equal by rtol
>>> df1 = spark.createDataFrame(data=[(1, 1000), (2, 3000)], schema=["id", "amount"])
>>> list_of_rows = [Row(1, 1000), Row(2, 3000)]
>>> assertDataFrameEqual(df1, list_of_rows)  # pass, actual and expected data are equal
>>> import pyspark.pandas as ps
>>> df1 = ps.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6], 'c': [7, 8, 9]})
>>> df2 = ps.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6], 'c': [7, 8, 9]})
>>> assertDataFrameEqual(df1, df2)  # pass, pandas-on-Spark DataFrames are equal
>>> df1 = spark.createDataFrame(
...     data=[("1", 1000.00), ("2", 3000.00), ("3", 2000.00)], schema=["id", "amount"])
>>> df2 = spark.createDataFrame(
...     data=[("1", 1001.00), ("2", 3000.00), ("3", 2003.00)], schema=["id", "amount"])
>>> assertDataFrameEqual(df1, df2)  
Traceback (most recent call last):
...
PySparkAssertionError: [DIFFERENT_ROWS] Results do not match: ( 66.66667 % )
*** actual ***
! Row(id='1', amount=1000.0)
Row(id='2', amount=3000.0)
! Row(id='3', amount=2000.0)
*** expected ***
! Row(id='1', amount=1001.0)
Row(id='2', amount=3000.0)
! Row(id='3', amount=2003.0)