检查类型:如何检查某物是 RDD 还是 DataFrame?

Check Type: How to check if something is a RDD or a DataFrame?

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

我试过 isinstance(thing, RDD)RDD 没有被识别。

我需要这样做的原因:

我正在编写一个可以传入 RDDDataFrame 的函数,所以如果 DataFrame 是已通过。

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'

最后,最 Pythonic 的方法是简单地检查接口:

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

另一种检查方式是类型

type(object) 

那个return对象的类型喜欢

pyspark.sql.dataframe.DataFrame

在函数体中,您可以赋值检查 input

的实例
from pyspark.rdd import RDD

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