Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PySpark作业的强制模式_Python_Apache Spark_Pyspark_Enums - Fatal编程技术网

Python PySpark作业的强制模式

Python PySpark作业的强制模式,python,apache-spark,pyspark,enums,Python,Apache Spark,Pyspark,Enums,我们有一堆不同的pyspark作业,并且有一个用例,其中两个作业可以链接在一起形成一个单独的第三个作业。因此,如果你有一个工作'A'和另一个工作'B',这些工作可以链接在一起,形成另一个工作'C'。显然,只有当“A”的输出数据帧模式与“B”的数据帧模式兼容时,才会发生这种情况。这正是dataset api实现的功能,但不幸的是spark没有为python提供dataset,这是可以理解的,因为python是动态类型的。然而,随着打字的出现,我们可以实现某种编译时安全性,我可以想出几种方法来实现这

我们有一堆不同的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
可以在运行每个作业后验证架构。您概述的其他方法似乎有点过于工程化——认为最好尽可能坚持使用简单的函数。好问题