【问题标题】:How do I get the last item from a list using pyspark?如何使用 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中不起作用?

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql


    【解决方案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')
        

        【讨论】:

          猜你喜欢
          • 2012-06-12
          • 1970-01-01
          • 1970-01-01
          • 2010-10-13
          • 2021-08-23
          • 1970-01-01
          • 1970-01-01
          • 2018-05-17
          相关资源
          最近更新 更多