Dataframe 如何使用pyspark数据帧中的列表值之和创建列

Dataframe 如何使用pyspark数据帧中的列表值之和创建列,dataframe,apache-spark,pyspark,user-defined-functions,Dataframe,Apache Spark,Pyspark,User Defined Functions,我是pyspark的新手,正在处理一个复杂的数据帧。经过一些筛选后,我一直在尝试将N行从列表中放入df.column 我有以下df.struct: root |-- struct1: struct (nullable = true) | |-- array1: array (nullable = true) | | |-- element: struct (containsNull = true) | | | |-- struct2 : struct

我是pyspark的新手,正在处理一个复杂的数据帧。经过一些筛选后,我一直在尝试将N行从列表中放入df.column

我有以下df.struct:

root
 |-- struct1: struct (nullable = true)
 |    |-- array1: array (nullable = true)
 |    |    |-- element: struct (containsNull = true)
 |    |    |    |-- struct2 : struct (nullable = true)
 |    |    |    |    |-- date: string (nullable = true)
 |    |    |    |    |-- value: string (nullable = true)
 |    |    |    |-- struct3 : struct (nullable = true)
 |    |    |    |    |-- date: string (nullable = true)
 |    |    |    |    |-- value: string (nullable = true)
 |    |    |    |-- property: string (nullable = true)
我想要实现的是在属性良好时获取所有struct2.values的总和。因为我可以为array1设置多个(N)值

现在,我得到了一个小句子来获得第一个属性。但我无法以成功的方式将其传递给udf,以迭代所有可能的行:
df.withColumn(“Sum”,(col('struct1.array1')[0])['property'])

我想到的一些步骤是:

  • 当property=Good时,筛选列表中的每个元素

  • 返回udf中的lambda值,其和为struct3.value

所需的输出应类似于:

None
+---------------------------------------------------------------------------------------------------------+
|Struct1                                                                                            |Sum|
+---------------------------------------------------------------------------------------------------------+
|[[[[2020-01-01, 10], [2020-02-02, 15], Good], [[2020-01-01, 20], [2020-02-02, 25], Good]]]         |20|
+---------------------------------------------------------------------------------------------------------+


任何帮助都将不胜感激

在这种情况下,您不一定需要自定义项。使用Spark>=2.4.0时,只需使用内置函数即可实现相同的功能,如下所示:

从pyspark.sql.functions导入expr
df.withColumn(“良好元素”),expr(“”“转换(\
过滤器(struct1.array1,e->e.property=='Good'),
e->cast(e.struct2.value为int)
)""")) \
.withColumn(“sum”,expr(“聚合(良好元素,0,(sum,e)->sum+e)”)
  • filter(struct1.array1,e->e.property=='Good')
    :首先我们过滤具有
    property=='Good'的项。

  • transform(…,e->cast(e.struct2.value为int)
    :接下来,我们将每个项转换为一个整数,并将它们存储到一个名为
    good\u elements

  • aggregate(good_elements,0,(sum,e)->sum+e)
    :最后我们通过计算
    good_elements的和来创建列
    sum


这是一个很好的解决方案。我以前从未听说过转换。有一个问题,它给了我一个错误:pyspark.sql.utils.AnalysisException:“无法解析给定输入列:[struct1]的“
struct2.value
”;;我从一开始就尝试添加路径,但仍然不起作用。我需要做更多的事情来尝试您的解决方案吗?是的,有一个错误@Als它应该是
e.struct2.value
而不是
struct2.value
。e是遍历
过滤器(struct1.array1,e->e.property=='Good')项的迭代器
。我刚刚更改了itI,当时我正在调试函数,我意识到迭代器e具有该值。感谢您的更正。这对@Alexandros Biratsis非常有帮助。我很高兴能够帮助@Als