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

Posted

技术标签:

【中文标题】检查类型:如何检查某个东西是 RDD 还是 DataFrame?【英文标题】:Check Type: How to check if something is a RDD or a DataFrame? 【发布时间】:2016-04-19 23:44:54 【问题描述】:

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

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

我需要这样做的原因:

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

【问题讨论】:

【参考方案1】:

另一种检查方法是输入

type(object) 

返回对象的类型,如

pyspark.sql.dataframe.DataFrame

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

from pyspark.rdd import RDD

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

【讨论】:

以上是关于检查类型:如何检查某个东西是 RDD 还是 DataFrame?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 RDD

Python 究竟是如何检查列表的?

如何检查类型是不是提供无参数构造函数?

如何使用火花流检查 rdd 是不是为空?

如何在不产生 .rdd 成本的情况下检查 Spark DataFrame 的分区数

如何检查猪 UDF 中的数据类型