检查类型:如何检查某个东西是 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
。
我需要这样做的原因:
我正在编写一个函数,其中RDD
和DataFrame
都可以传入,所以如果传入一个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?的主要内容,如果未能解决你的问题,请参考以下文章