Python 在pyspark中使用“when”时出现位置参数错误

Python 在pyspark中使用“when”时出现位置参数错误,python,database,apache-spark,pyspark,bigdata,Python,Database,Apache Spark,Pyspark,Bigdata,它在缺少1个必需的位置参数“value”时显示错误。但是,如果我在“0”之后放置一个值,则表示存在无法解决的错误 我将如何处理这个问题 谢谢 原始错误: 在0之后输入值时出错: 关系[alias226,country_blacklist227,country_whitelist228,parents229,title230]json\n我认为您的错误可能取决于您的parents列的结构 当我运行以下代码时,效果很好: test_df=spark.createDataFrame[a,b,1,c,d

它在缺少1个必需的位置参数“value”时显示错误。但是,如果我在“0”之后放置一个值,则表示存在无法解决的错误

我将如何处理这个问题

谢谢

原始错误:

在0之后输入值时出错:


关系[alias226,country_blacklist227,country_whitelist228,parents229,title230]json\n我认为您的错误可能取决于您的parents列的结构

当我运行以下代码时,效果很好:

test_df=spark.createDataFrame[a,b,1,c,d,0],别名,值,数字 test_df.选择别名、值,当test_df.number==0,0.otherwise test_df.number.show 结果:

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            
+- 
注意:我从数字中删除了[0],因为您只能在这里直接访问数组中的元素,但是如果使用==0进行测试则没有意义。所以我认为这里有一个错误,因为您测试parents==0,这表明parents是一个数值,然后您访问parents[0],这对数值不起作用。所以你得到了一个不匹配的类型错误

如果要处理相应列中的数组,应使用以下命令:

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

当你把一个值放在0后面时,实际的错误是什么?加上0是什么意思?就像在0之后添加另一个值一样?最好是显示实际发生的情况,而不是描述它。在0之后添加一个值后,我刚刚附上了错误消息的照片。如果我没有记错的话,当需要一个在满足条件时应该使用的值时。e、 g.当df_categories.parents==0时,使用一些_值。否则…如果parents确实是一个数组,并且您可以访问索引0处的元素,则必须将比较修改为:df_categories.parents[0]==0或array_包含df_categories.parents,0取决于要检查的元素的位置,或者如果您只是想知道值是否在数组中,我仍然不理解。我父母的结构保持不变,它在其他查询中工作得很好。错误是指数据类型不匹配,因此我假设字符串和数字值可能是问题所在?我还看到您在比较时使用了df_categories.parents,后来使用了df_categories 3.parents。这是有意的吗?它还在错误消息中告诉您:比较不起作用,因为要比较数组和int,这是不可能的。F_类别是以前使用select方法的数据帧。df_categories3是一个新的数据帧,因此它是预期的。
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            
+- 
+-----+-----+---------------------------------------------+ 
|alias|value|CASE WHEN (number = 0) THEN 0 ELSE number END|    
+-----+-----+---------------------------------------------+
|  a  |  b  |   1                                         | 
|  c  |  d  |   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()