Python PySpark作业的强制模式
我们有一堆不同的pyspark作业,并且有一个用例,其中两个作业可以链接在一起形成一个单独的第三个作业。因此,如果你有一个工作'A'和另一个工作'B',这些工作可以链接在一起,形成另一个工作'C'。显然,只有当“A”的输出数据帧模式与“B”的数据帧模式兼容时,才会发生这种情况。这正是dataset api实现的功能,但不幸的是spark没有为python提供dataset,这是可以理解的,因为python是动态类型的。然而,随着打字的出现,我们可以实现某种编译时安全性,我可以想出几种方法来实现这一点,一种是通过组合,另一种是通过继承。Python PySpark作业的强制模式,python,apache-spark,pyspark,enums,Python,Apache Spark,Pyspark,Enums,我们有一堆不同的pyspark作业,并且有一个用例,其中两个作业可以链接在一起形成一个单独的第三个作业。因此,如果你有一个工作'A'和另一个工作'B',这些工作可以链接在一起,形成另一个工作'C'。显然,只有当“A”的输出数据帧模式与“B”的数据帧模式兼容时,才会发生这种情况。这正是dataset api实现的功能,但不幸的是spark没有为python提供dataset,这是可以理解的,因为python是动态类型的。然而,随着打字的出现,我们可以实现某种编译时安全性,我可以想出几种方法来实现这
作文
from typing import TypeVar, Generic
from pyspark.sql import DataFrame
from enum import Enum
#Marker Enum
class Schema(Enum):
pass
T = TypeVar("T", bound = Schema)
class CustomDataSet(Generic[T]):
def __init__(self, dataframe: DataFrame) -> None:
self.dataframe = dataframe
现在我可以使用mypy并使用类似于CustomDataSet[MySchema](dataframe)
的组合。这里的问题是MySchema不是dataframe对象,这可能会让使用它的人感到困惑
继承
import abc
from enum import Enum
#Marker Enum
class Schema(Enum):
pass
class MyInterface(metaclass=abc.ABCMeta):
@abc.abstractmethod
def get_input_schema() -> Schema:
raise NotImplementedError
@abc.abstractmethod
def get_output_schema() -> Schema:
raise NotImplementedError
现在,两个作业“A”和“B”可以实现上述接口。这似乎是一种相当冗长的做事方式,而且感觉自己不喜欢继承
我的问题是,有没有一种更符合python的方法来实现这一点,最好是在我可以使用composition的地方?库中有一个
validate\u schema()
方法,如果数据帧架构与所需架构不同,它会引发异常:
下面是正在运行的函数:
data=[(“jose”,1),(“li”,2),(“luisa”,3)]
source_df=spark.createDataFrame(数据,[“名称”,“年龄”])
必需的\u schema=StructType([
StructField(“名称”,StringType(),True),
StructField(“城市”,StringType(),True),
])
validate_schema(source_df,required_schema)#抛出DataFrameMissingStructFieldError
可以在运行每个作业后验证架构。您概述的其他方法似乎有点过于工程化——认为最好尽可能坚持使用简单的函数。好问题。库中有一个
validate_schema()
方法,如果数据帧架构与所需架构不同,则会引发异常:
下面是正在运行的函数:
data=[(“jose”,1),(“li”,2),(“luisa”,3)]
source_df=spark.createDataFrame(数据,[“名称”,“年龄”])
必需的\u schema=StructType([
StructField(“名称”,StringType(),True),
StructField(“城市”,StringType(),True),
])
validate_schema(source_df,required_schema)#抛出DataFrameMissingStructFieldError
可以在运行每个作业后验证架构。您概述的其他方法似乎有点过于工程化——认为最好尽可能坚持使用简单的函数。好问题