【问题标题】:Get last n elements of pyspark array type column获取pyspark数组类型列的最后n个元素
【发布时间】:2019-08-28 22:37:48
【问题描述】:

我正在尝试获取每个名为 Foo 的数组列的最后 n 个元素,并从中创建一个单独的列,称为 last_n_items_of_Foo。 Foo 列数组的长度可变

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

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]

【问题讨论】:

    标签: pyspark pyspark-sql


    【解决方案1】:

    您可以编写自己的 UDF 以从 Array 中获取最后 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_df.withColumn('last_2_items_of_Foo', get_last_n_elements('Foo', f.lit(2))).show()
    +--------------------+---+---+-------------------+
    |                 Foo|Bar|Baz|last_2_items_of_Foo|
    +--------------------+---+---+-------------------+
    |        [1, 1, 2, 3]|  1|  0|             [2, 3]|
    |  [1, 1, 2, 7, 8, 9]|  0|  0|             [8, 9]|
    |[1, 1, 2, 3, 4, 5...|  1|  1|             [5, 8]|
    +--------------------+---+---+-------------------+
    
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-22
      • 2013-06-19
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 2019-03-29
      • 2010-10-11
      相关资源
      最近更新 更多