其實這個方法效果就好在Python:
from pyspark.sql.functions import array, udf
df = sc.parallelize([("a", "b", "c", "d")]).toDF()
f = udf(lambda xs: "+".join(xs))
df.select(f("_1")).show()
## +------------+
## |<lambda>(_1)|
## +------------+
## | a|
## +------------+
df.select(f(array("_1", "_2"))).show()
## +-----------------------+
## |<lambda>(array(_1, _2))|
## +-----------------------+
## | a+b|
## +-----------------------+
df.select(f(array("_1", "_2", "_3"))).show()
## +---------------------------+
## |<lambda>(array(_1, _2, _3))|
## +---------------------------+
## | a+b+c|
## +---------------------------+
因爲Python UDF是不一樣的類型像他們斯卡拉對應的實體都沒有通過輸入參數也使用args來的種類和數量的限制:
g = udf(lambda *xs: "+".join(xs))
df.select(g("_1", "_2", "_3", "_4")).show()
## +------------------------+
## |<lambda>(_1, _2, _3, _4)|
## +------------------------+
## | a+b+c+d|
## +------------------------+
避免與array
包裝輸入。
您還可以使用struct
作爲替代的包裝去的列名訪問:
h = udf(lambda row: "+".join(row.asDict().keys()))
df.select(h(struct("_1", "_2", "_3"))).show()
## +----------------------------+
## |<lambda>(struct(_1, _2, _3))|
## +----------------------------+
## | _1+_3+_2|
## +----------------------------+
非常感謝!有用。 – Yiliang
一個相關的問題:有沒有一種方法可以訪問udf中的列名,這樣我就可以從正確的字段獲取值?謝謝。 – Yiliang
你可以試試struct。 – zero323