Ошибка позиционного аргумента при использовании 'когда' в pyspark - PullRequest
0 голосов
/ 20 сентября 2018
import pyspark.sql.functions as f
df_categories4 = df_categories3.select("alias", "title", 
f.when(df_categories.parents == 0).otherwise(df_categories3.parents[0])).show()

Отображается ошибка, когда () отсутствует 1 обязательный позиционный аргумент: 'значение'.Но если я ставлю значение после '0', это говорит о том, что есть ошибка, которую невозможно устранить.

Как бы я подошел к этой проблеме?

Спасибо.

Исходная ошибка:

TypeError: when() missing 1 required positional argument: 'value'

Ошибка после ввода значения после 0:

AnalysisException: "cannot resolve '(`parents` = 0)' due to data type mismatch: 
differing types in '(`parents` = 0)' (array<string> and int).;;\n'Project 
[alias#226, title#230, CASE WHEN (parents#229 = 0) THEN 1 ELSE parents#229[0] 
END AS CASE WHEN (parents = 0) THEN 1 ELSE parents[0] END#1079]\n+- 
AnalysisBarrier\n      +- Filter ((array_contains(country_whitelist#228, US) || 
array_contains(country_whitelist#228, CA)) || isnull(country_whitelist#228))\n         
+- Filter (NOT (array_contains(country_blacklist#227, US) && 
array_contains(country_blacklist#227, CA)) || isnull(country_blacklist#227))\n            
+- 

Отношение [псевдоним # 226, country_blacklist# 227, country_whitelist # 228, родители # 229, заголовок # 230] json \ n "

1 Ответ

0 голосов
/ 20 сентября 2018

Я думаю, что ваша ошибка может зависеть от структуры вашего parents столбца.

Когда я запускаю следующий код, он работает нормально:

test_df = spark.createDataFrame([("a","b",1),("c","d",0)], ("alias","value","number"))
test_df.select("alias","value",when(test_df.number==0,"0").otherwise(test_df.number)).show()

Результаты:

+-----+-----+---------------------------------------------+ 
|alias|value|CASE WHEN (number = 0) THEN 0 ELSE number END|    
+-----+-----+---------------------------------------------+
|  a  |  b  |   1                                         | 
|  c  |  d  |   0                                         | 
+-----+-----+---------------------------------------------+

Примечание. Я удалил [0] из числа, поскольку здесь вы можете напрямую получить доступ только к элементу, если это массив, но тогда проверка с помощью == 0 не будет иметь смысла.Поэтому я думаю, что у вас есть ошибка, потому что вы проверяете parents==0, который указывает, что родители являются числовым значением, а позже вы получаете доступ к parents[0], который не работает для числовых значений.Таким образом, вы получаете «ошибку несоответствующего типа»

Если вы хотите иметь дело с массивами в соответствующем столбце, вы должны использовать что-то вроде:

test_df = spark.createDataFrame([("a","b",[1,]),("c","d",[0,])], ("alias","value","number"))
test_df.select("alias","value",when(array_contains(test_df.number,0),"0").otherwise(test_df.number)).show()
...