检查类型:如何检查某个东西是RDD还是DataFrame



我使用的是Python,这是一个Spark RDD/DataFrame。

我尝试了isinstance(thing, RDD),但无法识别RDD

我需要这样做的原因:

我正在编写一个函数,其中RDDDataFrame都可以传入,所以如果传入DataFrame,我需要执行input.rdd来获得底层RDD。

isinstance将正常工作:

from pyspark.sql import DataFrame
from pyspark.rdd import RDD
def foo(x):
    if isinstance(x, RDD):
        return "RDD"
    if isinstance(x, DataFrame):
        return "DataFrame"
foo(sc.parallelize([]))
## 'RDD'
foo(sc.parallelize([("foo", 1)]).toDF())
## 'DataFrame'

但单一调度是一种更优雅的方法:

from functools import singledispatch
@singledispatch
def bar(x):
    pass 
@bar.register(RDD)
def _(arg):
    return "RDD"
@bar.register(DataFrame)
def _(arg):
    return "DataFrame"
bar(sc.parallelize([]))
## 'RDD'
bar(sc.parallelize([("foo", 1)]).toDF())
## 'DataFrame'

如果你不介意额外的依赖关系,multipledispatch也是一个有趣的选择:

from multipledispatch import dispatch
@dispatch(RDD)
def baz(x):
    return "RDD"
@dispatch(DataFrame)
def baz(x):
    return "DataFrame"
baz(sc.parallelize([]))
## 'RDD'
baz(sc.parallelize([("foo", 1)]).toDF())
## 'DataFrame'

最后,最Python的方法是简单地检查一个接口:

def foobar(x):
    if hasattr(x, "rdd"):
        ## It is a DataFrame
    else:
        ## It (probably) is a RDD

另一种检查方法是键入

type(object) 

返回对象的类型,如

pyspark.sql.dataframe.DataFrame

在函数的主体中,可以有一个检查input 实例的赋值

from pyspark.rdd import RDD
def compute(input):
  your_rdd = input if isinstance(input, RDD) else input.rdd()

相关内容

  • 没有找到相关文章

最新更新