首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对清单进行排序的udf

对清单进行排序的udf
EN

Stack Overflow用户
提问于 2017-07-03 14:00:41
回答 2查看 4.9K关注 0票数 0

我有一个名为stopped的列是:

代码语言:javascript
复制
+--------------------+
|             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:

代码语言:javascript
复制
udf_sort = udf(lambda x: x.sort(), ArrayType(StringType()))
ps_clean.select("*", udf_sort(ps_clean["stopped"])).show(5, False)

我得到了:

代码语言:javascript
复制
+---------+----------+---------------------+------------+--------------------------+--------------------------+-----------------+
|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             |
+---------+----------+---------------------+------------+--------------------------+--------------------------+-----------------+

为什么不应用排序?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-03 15:17:33

x.sort()通常会对列表进行排序(但我怀疑它不会在pyspark中这样做)并返回None。这就是标记为<lambda>(stopped)的列具有所有null值的reaason。sorted(x)将对列表进行排序,并返回一个新的排序副本。因此,将您的udf替换为

代码语言:javascript
复制
udf_sort = udf(lambda x: sorted(x), ArrayType(StringType()))

应该能解决你的问题。

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

代码语言:javascript
复制
from pyspark.sql.functions import sort_array

ps_clean.select("*", sort_array(ps_clean["stopped"])).show(5, False)

这个方法有点简洁,实际上您可以期望获得一些性能上的提高,因为pyspark不需要序列化您的udf。

票数 2
EN

Stack Overflow用户

发布于 2017-07-03 15:15:25

将udf更改为:

代码语言:javascript
复制
udf_sort = udf(lambda x: sorted(x), ArrayType(StringType()))

关于beetwen .sort().sorted()的差异,案文如下:

? python

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44887534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档