Pyspark中的UDF和python函数

时间:2018-12-05 11:03:45

标签: python-3.x pyspark user-defined-functions

我在Pyspark中有一个数据框,如下:

listA = [(1,'AAA','USA'),(2,'XXX','CHN'),(3,'KKK','USA'),(4,'PPP','USA'),(5,'EEE','USA'),(5,'HHH','THA')]
df = spark.createDataFrame(listA, ['id', 'name','country'])

我创建了一个字典,为:

thedict={"USA":"WASHINGTON","CHN":"BEIJING","DEFAULT":"KEY NOT FOUND"}

然后我创建了一个UDF来从字典中获取匹配的键值。

def my_func(letter):
    if(thedict.get(letter) !=None):
        return thedict.get(letter)
    else:
        return thedict.get("DEFAULT")

尝试以以下方式调用函数时,出现以下错误:

df.withColumn('CAPITAL',my_func(df.country))

  File "<stdin>", line 1, in <module>
  File "/usr/hdp/current/spark2-client/python/pyspark/sql/dataframe.py", line 1848, in withColumn
    assert isinstance(col, Column), "col should be Column"
AssertionError: col should be Column

如果我将其嵌入pyspark.sql.functions,则可以正常工作。

from pyspark.sql.functions import col, udf
udfdict = udf(my_func,StringType())

df.withColumn('CAPITAL',udfdict(df.country)).show()

+---+----+-------+-------------+
| id|name|country|      CAPITAL|
+---+----+-------+-------------+
|  1| AAA|    USA|   WASHINGTON|
|  2| XXX|    CHN|      BEIJING|
|  3| KKK|    USA|   WASHINGTON|
|  4| PPP|    USA|   WASHINGTON|
|  5| EEE|    USA|   WASHINGTON|
|  5| HHH|    THA|KEY NOT FOUND|
+---+----+-------+-------------+

我不明白这两个电话有什么区别?

1 个答案:

答案 0 :(得分:1)

UDF函数具有特殊的属性,因为它们采用列,并逐行应用逻辑以产生新列。而普通的python函数仅接受一个离散参数,并产生单个输出。

这就是错误所在。从函数返回的值不是列

  

断言isinstance(col,Column),“ col应该是Column”

您可以通过两种方式定义udf:

  1. myudf = udf(LAMBDA_EXPRESSION,RETURN_TYPE)
  2. myudf = udf(CUSTOM_FUNCTION,RETURN_TYPE)