【问题标题】:regular expression pyspark dataframe column正则表达式 pyspark 数据框列
【发布时间】:2018-11-19 23:37:38
【问题描述】:

我的数据框看起来像这样。

我有一个 pyspark 数据框,我想使用正则表达式将 A 列拆分为 A1 和 A2,但这不起作用。

A                 |   A1           | A2
20-13-2012-monday    20-13-2012     monday
20-14-2012-tues      20-14-2012     tues
20-13-2012-wed       20-13-2012     wed

我的代码是这样的

import re
from pyspark.sql.functions import regexp_extract   
reg = r'^([\d]+-[\d]+-[\d]+)'
df=df.withColumn("A1",re.match(reg, df.select(['A'])).group())
df.show()

【问题讨论】:

  • 您正在将 python 库中的 re 与 spark 混合。 pyspark.sql.functions.split 可以在正则表达式上拆分:df=df.withColumn("A1",split(col("A"), reg))
  • 我得到像 -- [ , monday] 这样的输出。我只想要星期一。没有逗号没有[]
  • 它说语法无效
  • 这是一个有用的帖子:Reference: what does this regex mean?

标签: pyspark


【解决方案1】:

您可以将正则表达式用作udf 并实现所需的输出,如下所示:

>>> import re
>>> from pyspark.sql.types import *
>>> from pyspark.sql.functions import udf

>>> def get_date_day(a):
...   x, y = re.split('^([\d]+-[\d]+-[\d]+)', a)[1:]
...   return [x, y[1:]]

>>> get_date_day('20-13-2012-monday')
['20-13-2012', 'monday']

>>> get_date_day('20-13-2012-monday')
['20-13-2012', '-monday']
>>> get_date_udf = udf(get_date_day, ArrayType(StringType()))


>>> df = sc.parallelize([('20-13-2012-monday',), ('20-14-2012-tues',), ('20-13-2012-wed',)]).toDF(['A'])
>>> df.show()
+-----------------+
|                A|
+-----------------+
|20-13-2012-monday|
|  20-14-2012-tues|
|   20-13-2012-wed|
+-----------------+

>>> df = df.withColumn("A12", get_date_udf('A'))
>>> df.show(truncate=False)
+-----------------+--------------------+
|A                |A12                 |
+-----------------+--------------------+
|20-13-2012-monday|[20-13-2012, monday]|
|20-14-2012-tues  |[20-14-2012, tues]  |
|20-13-2012-wed   |[20-13-2012, wed]   |
+-----------------+--------------------+

>>> df = df.withColumn("A1", udf(lambda x:x[0])('A12')).withColumn("A2", udf(lambda x:x[1])('A12'))
>>> df = df.drop('A12')
>>> df.show(truncate=False)
+-----------------+----------+------+
|A                |A1        |A2    |
+-----------------+----------+------+
|20-13-2012-monday|20-13-2012|monday|
|20-14-2012-tues  |20-14-2012|tues  |
|20-13-2012-wed   |20-13-2012|wed   |
+-----------------+----------+------+

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2021-03-23
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    相关资源
    最近更新 更多