Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何使用pyspark从列表中获取最后一项?_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Apache spark 如何使用pyspark从列表中获取最后一项?

Apache spark 如何使用pyspark从列表中获取最后一项?,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,为什么列1st\u from\u 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].

为什么列
1st\u from\u 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]
是一种获取列表中最后一项的好方法。为什么它在pyspark中不工作?

如果您使用的是Spark>=2.4.0,请参阅jxc的答案

在Spark<2.4.0中,dataframes API不支持Spark<2.4.0中数组的
-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|
+--------------------+

创建您自己的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')

在jamiet的解决方案的基础上,我们可以通过删除
反向

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()

有关Spark 2.4+,请使用,请参阅以下文档:

element_at(数组,索引)-返回给定(基于1的)索引处数组的元素。如果索引<0,则从最后一个到第一个访问元素。如果索引超过数组的长度,则返回NULL


谢谢你证实我的怀疑。我的解决方案比这要简单一些:
reverse(split(reverse(df.s),“”)[0])
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|
+---+---+------------+