获取pyspark数组类型列的最后n个元素

获取pyspark数组类型列的最后n个元素,pyspark,pyspark-sql,Pyspark,Pyspark Sql,我试图获取每个数组列中名为Foo的最后n个元素,并从中生成一个单独的列,称为last_n_items_of_Foo。Foo列数组具有可变长度 我看过这篇文章 但是它有一个方法不能用来访问最后的元素 import pandas as pd from pyspark.sql.functions import udf, size from pyspark.sql.types import StringType from pyspark.sql.functions import col df = pd

我试图获取每个数组列中名为Foo的最后n个元素,并从中生成一个单独的列,称为last_n_items_of_Foo。Foo列数组具有可变长度

我看过这篇文章 但是它有一个方法不能用来访问最后的元素

import pandas as pd
from pyspark.sql.functions import udf, size
from pyspark.sql.types import StringType
from pyspark.sql.functions import col

df = pd.DataFrame([[[1,1,2,3],1,0],[[1,1,2,7,8,9],0,0],[[1,1,2,3,4,5,8],1,1]],columns = ['Foo','Bar','Baz'])


spark_df = spark.createDataFrame(df)
下面是输出的外观

如果n=2

                Foo        Bar  Baz   last_2_items_of_Foo  
0           [1, 1, 2, 3]    1    0      [2, 3]
1     [1, 1, 2, 7, 8, 9]    0    0      [8, 9] 
2  [1, 1, 2, 3, 4, 5, 8]    1    1      [5, 8]

您可以编写自己的UDF以从数组中获取最后n个元素:

import pyspark.sql.functions as f
import pyspark.sql.types as t

def get_last_n_elements_(arr, n):
            return arr[-n:]

get_last_n_elements = f.udf(get_last_n_elements_, t.ArrayType(t.IntegerType()))
UDF将列数据类型作为参数,因此使用
f.lit(n)

显然,在spark 2.4中,有一个内置函数可以对数组进行切片

目前,我的系统中没有2.4+版本,但如下所示:

spark_df.withColumn('last_2_items_of_Foo', f.slice('Foo', -2)).show()


您可以编写自己的UDF以从数组中获取最后n个元素:

import pyspark.sql.functions as f
import pyspark.sql.types as t

def get_last_n_elements_(arr, n):
            return arr[-n:]

get_last_n_elements = f.udf(get_last_n_elements_, t.ArrayType(t.IntegerType()))
UDF将列数据类型作为参数,因此使用
f.lit(n)

显然,在spark 2.4中,有一个内置函数可以对数组进行切片

目前,我的系统中没有2.4+版本,但如下所示:

spark_df.withColumn('last_2_items_of_Foo', f.slice('Foo', -2)).show()