【问题标题】:How to get the lists' length in one column in dataframe spark?如何在数据框火花的一列中获取列表的长度?
【发布时间】:2017-11-16 10:03:13
【问题描述】:

我有一个 df,其“产品”列是如下列表:

+----------+---------+--------------------+
|member_srl|click_day|            products|
+----------+---------+--------------------+
|        12| 20161223|  [2407, 5400021771]|
|        12| 20161226|        [7320, 2407]|
|        12| 20170104|              [2407]|
|        12| 20170106|              [2407]|
|        27| 20170104|        [2405, 2407]|
|        28| 20161212|              [2407]|
|        28| 20161213|      [2407, 100093]|
|        28| 20161215|           [1956119]|
|        28| 20161219|      [2407, 100093]|
|        28| 20161229|           [7905970]|
|       124| 20161011|        [5400021771]|
|      6963| 20160101|         [103825645]|
|      6963| 20160104|[3000014912, 6626...|
|      6963| 20160111|[99643224, 106032...|

如何添加一个新列product_cnt,这是products列表的长度?以及如何过滤 df 以获取具有给定产品长度条件的指定行? 谢谢。

【问题讨论】:

    标签: pyspark


    【解决方案1】:

    第一个问题

    如何添加一个新的列product_cnt是产品列表的长度?

    >>> a = [(12,20161223, [2407,5400021771]),(12,20161226,[7320,2407])]
    >>> df = spark.createDataFrame(a,
    ["member_srl","click_day","products"])
    >>> df.show()
    +----------+---------+------------------+
    |member_srl|click_day|          products|
    +----------+---------+------------------+
    |        12| 20161223|[2407, 5400021771]|
    |        12| 20161226|[7320, 2407, 4344]|
    +----------+---------+------------------+
    

    你可以找到一个类似的例子here

    >>> from pyspark.sql.types import IntegerType
    >>> from pyspark.sql.functions import udf
    
    >>> slen = udf(lambda s: len(s), IntegerType())
    
    >>> df2 = df.withColumn("product_cnt", slen(df.products))
    >>> df2.show()
    +----------+---------+------------------+-----------+
    |member_srl|click_day|          products|product_cnt|
    +----------+---------+------------------+-----------+
    |        12| 20161223|[2407, 5400021771]|          2|
    |        12| 20161226|[7320, 2407, 4344]|          3|
    +----------+---------+------------------+-----------+
    

    第二个问题

    以及如何过滤 df 以获取具有给定产品长度条件的指定行?

    你可以使用filter函数docs here

    >>> givenLength = 2
    >>> df3 = df2.filter(df2.product_cnt==givenLength)
    >>> df3.show()
    +----------+---------+------------------+-----------+
    |member_srl|click_day|          products|product_cnt|
    +----------+---------+------------------+-----------+
    |        12| 20161223|[2407, 5400021771]|          2|
    +----------+---------+------------------+-----------+
    

    【讨论】:

      【解决方案2】:

      Pyspark 有一个内置函数可以准确地实现您想要的,称为sizehttp://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.functions.size 。 要将其添加为列,您只需在 select 语句中调用它即可。

      from pyspark.sql.functions import size
      
      countdf = df.select('*',size('products').alias('product_cnt'))
      

      过滤的工作方式与@titiro89 描述的完全一样。此外,您可以在过滤器中使用size 函数。这将允许您通过以下方式绕过添加额外的列(如果您希望这样做)。

      filterdf = df.filter(size('products')==given_products_length)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-14
        • 1970-01-01
        • 2017-02-15
        • 1970-01-01
        • 1970-01-01
        • 2018-11-30
        • 2017-06-05
        • 1970-01-01
        相关资源
        最近更新 更多