pyspark 修改数组列的值

kgsdhlau  于 2023-04-05  发布在  Spark
关注(0)|答案(1)|浏览(143)

我在df中有两列,我想根据一些条件转换它们的一些值。这些列是collect_setaggregations的结果,所以我可以选择预先应用一些转换,而不需要再次分解。
更具体地说,让我们假设Dataframe看起来像这个表:

df = [
 (1,["0","1","2"],["10"]),
 (2,["0"],["20"]),
 (3,["3"],[null])
]

我想把它转换成这样:
1.如果arr1列有多于1个元素,如果存在,则删除'0'。如果'0'是唯一的元素,则保留它。
1.如果arr2没有元素,则向其传递默认值。
我尝试将size(col1)应用于这些列,但我再次得到Column not iterable error . exploding数组和collecting它们的sets它们的选项出于性能原因对我来说真的不是一个选项,所以我必须事先有创造性,或者以某种方式直接将转换应用于数组,但以一种成本有效的方式。
话虽如此,希望的结果将是:

df = [
 (1,["1","2"],["10"]),
 (2,["0"],["20"]),
 (3,["3"],["default_value"])
]

排序并不重要

nnvyjq4y

nnvyjq4y1#

使用**size,higher**order数组函数过滤掉数组元素中的0,而不进行分解。

一米一米一

df = spark.createDataFrame([(1,["0","1","2"],["10"]),(2,["0"],["20"]),(3,["3"],[None])],['id','arr','arr1'])
df.withColumn('arr',when(size(col("arr"))>1,expr("filter(arr, x -> x != 0)")).otherwise(col("arr"))).show(10,False)
#+---+------+------+
#|id |arr   |arr1  |
#+---+------+------+
#|1  |[1, 2]|[10]  |
#|2  |[0]   |[20]  |
#|3  |[3]   |[null]|
#+---+------+------+

相关问题