一般來說它會更有意義,以解決這一問題的上游,但你可以嘗試例如是這樣的:
from operator import truediv
def f(vs):
try:
d = dict(vs)
except ValueError:
d = dict([vs])
s = sum(d.values())
return truediv(d.get("S", 0), s) if s else float('nan')
rdd = sc.parallelize([('a', ('H', 1)), ('b', (('H', 41), ('S', 1)))])
rdd.mapValues(f).collect()
## [('a', 0.0), ('b', 0.023809523809523808)]
另外,如果你不介意的外部依賴性,你可以嘗試使用multipledispatch
:
from multipledispatch import dispatch
@dispatch(tuple, tuple)
def f(h, s):
try:
return truediv(s[1], h[1] + s[1])
except ZeroDivisionError:
return float('nan')
@dispatch(str, int)
def f(x, y):
return 0.0
rdd.mapValues(lambda args: f(*args)).collect()
## [('a', 0.0), ('b', 0.023809523809523808)]
你是如何得到這樣的數據呢?它是一種具有特定意義的層次結構嗎?如果沒有,我會更有意義的執行上游一致的整形器。 Python自3.4以來提供了基本的調度機制,但這些都很淺。 – zero323