如何使用 pyspark 从列表中获取最后一项?
Posted
技术标签:
【中文标题】如何使用 pyspark 从列表中获取最后一项?【英文标题】:How do I get the last item from a list using pyspark? 【发布时间】:2016-11-07 14:45:12 【问题描述】:为什么列1st_from_end
包含null:
from pyspark.sql.functions import split
df = sqlContext.createDataFrame([('a b c d',)], ['s',])
df.select( split(df.s, ' ')[0].alias('0th'),
split(df.s, ' ')[3].alias('3rd'),
split(df.s, ' ')[-1].alias('1st_from_end')
).show()
我认为使用[-1]
是一种获取列表中最后一项的pythonic 方式。为什么在pyspark中不起作用?
【问题讨论】:
【参考方案1】:对于 Spark 2.4+,请使用 pyspark.sql.functions.element_at,请参阅以下文档:
element_at(array, index) - 返回给定(从 1 开始)索引处的数组元素。如果 index
from pyspark.sql.functions import element_at, split, col
df = spark.createDataFrame([('a b c d',)], ['s',])
df.withColumn('arr', split(df.s, ' ')) \
.select( col('arr')[0].alias('0th')
, col('arr')[3].alias('3rd')
, element_at(col('arr'), -1).alias('1st_from_end')
).show()
+---+---+------------+
|0th|3rd|1st_from_end|
+---+---+------------+
| a| d| d|
+---+---+------------+
【讨论】:
【参考方案2】:如果您使用的是 Spark >= 2.4.0,请参阅 jxc 的回答 below。
在 Spark -1 索引,但您可以编写自己的 UDF 或使用内置的 size()
函数,例如:
>>> from pyspark.sql.functions import size
>>> splitted = df.select(split(df.s, ' ').alias('arr'))
>>> splitted.select(splitted.arr[size(splitted.arr)-1]).show()
+--------------------+
|arr[(size(arr) - 1)]|
+--------------------+
| d|
+--------------------+
【讨论】:
感谢您确认我的怀疑。我的解决方案比这更狡猾:reverse(split(reverse(df.s), ' ')[0])
【参考方案3】:
基于 jamiet 的解决方案,我们可以通过删除 reverse
来进一步简化
from pyspark.sql.functions import split, reverse
df = sqlContext.createDataFrame([('a b c d',)], ['s',])
df.select( split(df.s, ' ')[0].alias('0th'),
split(df.s, ' ')[3].alias('3rd'),
reverse(split(df.s, ' '))[-1].alias('1st_from_end')
).show()
【讨论】:
【参考方案4】:创建你自己的 udf 看起来像这样
def get_last_element(l):
return l[-1]
get_last_element_udf = F.udf(get_last_element)
df.select(get_last_element(split(df.s, ' ')).alias('1st_from_end')
【讨论】:
以上是关于如何使用 pyspark 从列表中获取最后一项?的主要内容,如果未能解决你的问题,请参考以下文章