为什么1st_from_end
列包含空值:
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]
是一种获取列表中最后一项的Python方法,为什么它在pyspark中不起作用呢?
6条答案
按热度按时间rfbsl7qr1#
对于Spark 2.4+,请使用pyspark.sql.functions.element_at,请参阅以下文档:
element_at(array,index)-返回数组中给定索引的元素。如果索引〈0,则从最后一个元素到第一个元素进行访问。如果索引超过数组的长度,则返回NULL。
cgh8pdjw2#
如果你使用的是Spark〉= 2.4.0,请看jxc的答案below。
在Spark〈2.4.0中,dataframes API不支持数组上的
-1
索引,但您可以编写自己的UDF或使用内置的size()
函数,例如:4nkexdtk3#
基于jamiet的解决方案,我们可以通过删除
reverse
来进一步简化64jmpszr4#
你也可以使用
getItem
方法,它允许你获取一个ArrayType列的第i个元素。ijxebb2r5#
这里有一个使用列表达式的小技巧。它非常简洁,因为没有使用udf。但是函数式接口仍然让我很喜欢它。
输出:
siv3szwd6#
创建您自己的udf将如下所示