我有一个相对简单的PySpark应用程序,它读取一个输入表,执行一些转换并输出一个新表。
我想使用一个带有已知模拟数据的输入表的虚拟版本对这个脚本进行单元测试。但是,由于输入表具有相当复杂的嵌套模式,因此手动为输入创建DataFrame(例如,直接在测试代码中或从JSON文件)是相当麻烦的。
通常情况下,只有有限数量的字段与我的测试用例相关,所以我希望有一个解决方案,可以让我轻松地创建一个DataFrame,将相关字段设置为已知值,并将其余部分保留为一些我不必指定的默认值。
我想到的一个可能的解决方案是将DataFrame模式转换为Python类。这将允许我为每个测试用例创建类的示例,使用简单的Python类属性语法操作相关字段,然后将从测试用例类创建的DataFrame写入伪表。在代码中,它看起来像这样:
test_case1 = DataFrameClassRepresentation() # this class was generated from schema
test_case2 = DataFrameClassRepresentation()
test_case1.foo.bar = "some value"
test_case2.foo.baz = "some other value"
df = spark.createDataFrame([test_case1, test_case2])
df.writeTo("catalog.db.dummy_table")
在PySpark中,是否有一些内置的功能或其他简单的方法来从模式生成这样的类?有没有更简单的策略来实现我想做的事情,我还没有想到?
2条答案
按热度按时间w46czmvw1#
我不确定这是不是你想要的,因为它需要你定义多个类来匹配预期的模式(能够使用模式本身初始化类会更方便,但我不确定这是否可能)。但是,它允许您定义默认值并使用适当的模式创建测试框架。我还定义了一个
getSchema
函数,它从DataFrameClassRepresentation
的每个示例中提取pyspark模式。然后,您可以通过以下方式创建测试框架:
pkwftd7m2#
您可以从头开始创建一个
DataFrameClassRepresentation
类,使用所需的pyspark模式设置类变量。类中有一个递归方法,它可以解包模式,无论有多少层深,将其转换为每个字段(包括嵌套字段)具有默认值的Python字典,然后根据字典设置类变量。默认值也有内部类变量,这不是绝对必要的,但可能对您的用例有帮助。然后,您可以声明类的示例以进行单元测试,并能够根据需要设置不同的字段:
下面是
test_df
及其schema
的打印输出: