【问题标题】:Positional argument error when using 'when' in pyspark在 pyspark 中使用“when”时出现位置参数错误
【发布时间】:2019-02-24 12:17:26
【问题描述】:
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()

它显示 when() 缺少 1 个必需的位置参数:'value' 的错误。但是如果我在 '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            
+- 

关系[alias#226,country_blacklist#227,country_whitelist#228,parents#229,title#230] json\n"

【问题讨论】:

  • 当您在 0 之后放置一个值时,实际错误是什么?
  • 加0是什么意思?喜欢在 0 之后添加另一个值?
  • 最好是展示实际发生的事情,而不是描述它。
  • 我刚刚附上了错误消息的照片,在 0 之后添加了一个值
  • when 需要一个值,如果我没记错的话,如果满足条件,应该使用该值。例如when(df_categories.parents == 0, SOME_VALUE).otherwise(...)

标签: python database apache-spark pyspark bigdata


【解决方案1】:

我认为您的错误可能取决于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()

【讨论】:

  • 如果 parents 确实是一个数组,并且您可以访问索引 0 处的元素,则必须将比较修改为:df_categories.parents[0] == 0array_contains(df_categories.parents, 0),具体取决于您要检查的元素,或者您是否只想知道该值是否在数组中
  • 我还是不明白。我父母的结构保持不变,它非常适合其他查询。错误是提到数据类型不匹配,所以我假设字符串和数字值可能是问题?
  • 我也看到你的比较你使用df_categories.parents,后来你使用df_categories3.parents这是有意的吗?
  • 它还在错误消息中告诉你:比较不起作用,因为你想比较(array&lt;string&gt; and int)这是不可能的
  • df_categories 是以前使用 select 方法的先前数据框。 df_categories3 是一个新的数据框,因此它是预期的。
猜你喜欢
  • 2020-05-26
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 2022-01-18
  • 2018-01-18
  • 2016-08-12
  • 1970-01-01
  • 2020-01-23
相关资源
最近更新 更多