检查类型:如何检查某些内容是RDD还是数据帧?

时间:2016-04-19 23:44:55

标签: python apache-spark dataframe apache-spark-sql rdd

我正在使用python,这是Spark Rdd / dataframes。

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

我需要这样做的原因:

我正在编写一个可以传入RDD和数据帧的函数,所以如果传入数据帧,我需要输入input.rdd来获取底层的rdd。

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

另一种检查方法是输入

type(object)

返回对象的类型,如

pyspark.sql.dataframe.DataFrame

答案 2 :(得分:0)

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

的实例。
from pyspark.rdd import RDD

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