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