在PySpark中使用``何时''时的位置参数错误

时间:2018-09-20 08:33:42

标签: python database apache-spark pyspark bigdata

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“

1 个答案:

答案 0 :(得分:0)

我认为您的错误可能取决于您的"raise TypeError(repr(o) + " is not JSON serializable")" 列的结构。

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

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]