2016-04-13 69 views
0

我有2列名稱,年齡的數據框。 我想添加包含str.count(name)值的新列name_length。通過UserDefinedFunction在spark python中添加新列(字符串長度)

代碼:

from pyspark.sql.functions import UserDefinedFunction 
from pyspark.sql.types import DoubleType 

udf = UserDefinedFunction(lambda x: str.count(x.alias(name)), DoubleType()) 
df_with_new_column = nonull_df.withColumn('name_length', udf()) 
print df_with_new_column.show() 

當我運行此,我收到錯誤: "ValueError: (ValueError('No args or kwargs',), <function <lambda> at 0x7feac13329b0>,())"

回答

0

正如大衛·格里芬前面說的,你不要因爲有一個建在pyspark SQL函數功能長度()需要這樣的UDF。爲了用開箱即用的工作代碼來澄清他的答案,您需要從pyspark sql函數中調用方法,如下所示。

import pyspark.sql.functions as F 
df = df.withColumn('your_column_length', F.length(your_column)) 
+0

歡迎來到SO。 SO上的每一個答案都應該完全回答這個問題。如果您認爲可以讓它們變得更好,請使用編輯功能來改進其他答案 –

1

你不需要爲這個UDF。有一個內置函數length()。你應該能夠做到:

SELECT length(your_column_name_here) as name_length 
0
  1. str.count不計算長度。它是用來獲取

    the number of non-overlapping occurrences of substring sub in string S[start:end].

    ,它至少需要兩個參數字符串和模式

  2. 論證會收到內部udf是普通的Python對象不是列。它不會有alias方法。

  3. 您可以定義UDF,它只接受一個參數,但不傳遞(直接出錯的源)。

  4. 最後,已經內置size function來處理這個問題。

相關問題