Dataframe 如何使用pyspark数据帧中的列表值之和创建列
我是pyspark的新手,正在处理一个复杂的数据帧。经过一些筛选后,我一直在尝试将N行从列表中放入df.column 我有以下df.struct: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
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
struct2.value
”;;我从一开始就尝试添加路径,但仍然不起作用。我需要做更多的事情来尝试您的解决方案吗?是的,有一个错误@Als它应该是e.struct2.value
而不是struct2.value
。e是遍历过滤器(struct1.array1,e->e.property=='Good')项的迭代器
。我刚刚更改了itI,当时我正在调试函数,我意识到迭代器e具有该值。感谢您的更正。这对@Alexandros Biratsis非常有帮助。我很高兴能够帮助@Als