【问题标题】:udf that sorts list in pyspark在pyspark中对列表进行排序的udf
【发布时间】:2017-07-03 23:17:33
【问题描述】:

我有一个数据框,其中一个名为 stopped 的列是:

+--------------------+
|             stopped|
+--------------------+
|[nintendo, dsi, l...|
|[nintendo, dsi, l...|
|    [xl, honda, 500]|
|[black, swan, green]|
|[black, swan, green]|
|[pin, stripe, sui...|
|  [shooting, braces]|
|      [haus, geltow]|
|[60, cm, electric...|
|  [yamaha, yl1, yl2]|
|[landwirtschaft, ...|
|     [wingbar, 9581]|
|       [gummi, 16mm]|
|[brillen, lupe, c...|
|[man, city, v, ba...|
|[one, plus, one, ...|
|     [kapplocheisen]|
|[tractor, door, m...|
|[pro, nano, flat,...|
|[kaleidoscope, to...|
+--------------------+

我想创建另一个列,其中包含相同的列表,但关键字是按顺序排列的。

据我了解,我需要创建一个接受并返回列表的 udf:

udf_sort = udf(lambda x: x.sort(), ArrayType(StringType()))
ps_clean.select("*", udf_sort(ps_clean["stopped"])).show(5, False)

我得到:

+---------+----------+---------------------+------------+--------------------------+--------------------------+-----------------+
|client_id|kw_id     |keyword              |max_click_dt|tokenized                 |stopped                   |<lambda>(stopped)|
+---------+----------+---------------------+------------+--------------------------+--------------------------+-----------------+
|710      |4304414582|nintendo dsi lite new|2017-01-06  |[nintendo, dsi, lite, new]|[nintendo, dsi, lite, new]|null             |
|705      |4304414582|nintendo dsi lite new|2017-03-25  |[nintendo, dsi, lite, new]|[nintendo, dsi, lite, new]|null             |
|707      |647507047 |xl honda 500 s       |2016-10-26  |[xl, honda, 500, s]       |[xl, honda, 500]          |null             |
|710      |26308464  |black swan green     |2016-01-01  |[black, swan, green]      |[black, swan, green]      |null             |
|705      |26308464  |black swan green     |2016-07-13  |[black, swan, green]      |[black, swan, green]      |null             |
+---------+----------+---------------------+------------+--------------------------+--------------------------+-----------------+

为什么没有应用排序?

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案1】:

    x.sort() 通常对列表进行适当的排序(但我怀疑它不会在 pyspark 数据帧中这样做)并返回None。这就是您标记为&lt;lambda&gt;(stopped) 的列具有所有null 值的原因。sorted(x) 将对列表进行排序并返回一个新的排序副本。所以,用

    替换你的 udf
    udf_sort = udf(lambda x: sorted(x), ArrayType(StringType()))
    

    应该可以解决你的问题。

    或者,您可以使用内置函数sort_array,而不是定义自己的udf。

    from pyspark.sql.functions import sort_array
    
    ps_clean.select("*", sort_array(ps_clean["stopped"])).show(5, False)
    

    这种方法更简洁一些,并且您实际上可以期望获得一些性能提升,因为 pyspark 不必序列化您的 udf。

    【讨论】:

      【解决方案2】:

      将您的 udf 更改为:

      udf_sort = udf(lambda x: sorted(x), ArrayType(StringType()))
      

      关于 beetwen .sort().sorted() 的差异阅读:

      What is the difference between `sorted(list)` vs `list.sort()` ? python

      【讨论】:

        猜你喜欢
        • 2021-08-13
        • 2017-09-08
        • 1970-01-01
        • 1970-01-01
        • 2018-12-22
        • 2021-03-16
        • 2013-10-12
        • 2015-09-13
        • 2012-01-15
        相关资源
        最近更新 更多