比较来自世界各地的卖家的域名和 IT 服务价格

PySpark - 丁字裤创建一个新列

我有 dataframe 作为:


ID Notes
2345 Checked by John
2398 Verified by Stacy
3983 Double Checked on 2/23/17 by Marsha


假设只有 3 您需要检查的员工:John,Stacy或Marsha。 我想制作这样的新列:


ID Notes Employee
2345 Checked by John John
2398 Verified by Stacy Stacy
3983 Double Checked on 2/23/17 by Marsha Marsha


这在这里更好 regex 或者 grep? 我应该尝试什么功能? 谢!

EDIT: 我尝试了一堆解决方案,但似乎没有工作。 我应该放弃,而是为每个员工创建列的列吗? IE:


ID Notes John Stacy Marsha
2345 Checked by John 1 0 0
2398 Verified by Stacy 0 1 0
3983 Double Checked on 2/23/17 by Marsha 0 0 1
已邀请:

八刀丁二

赞同来自:

简而言之:


regexp_extract/col/'Notes'/, '/.//by//\s+//\w+/', 4//


这个表达提取物

员工的姓名



任何职位

, 它位于哪里



文本列中的空白 /

col/'Notes'/

/

详细地:

创建一个样本 dataframe


data = [/'2345', 'Checked by John'/,
/'2398', 'Verified by Stacy'/,
/'2328', 'Verified by Srinivas than some random text'/,
/'3983', 'Double Checked on 2/23/17 by Marsha'/]

df = sc.parallelize/data/.toDF/['ID', 'Notes']/

df.show//

+----+--------------------+
| ID| Notes|
+----+--------------------+
|2345| Checked by John|
|2398| Verified by Stacy|
|2328|Verified by Srini...|
|3983|Double Checked on...|
+----+--------------------+


做出必要的进口


from pyspark.sql.functions import regexp_extract, col



df

删除名称
Employee

从柱子
regexp_extract/column_name, regex, group_number/

.

这里

regex

/
'/.//by//\s+//\w+/'

/ 方法

/./

- 爱的象征 /除了新的线条/

/从/

- 单词

在文中

/\s+/

- 一个或多个差距

/\w+/

- 字母数字字符或长度的同步



group_number

掠夺 4, 因为 group
/\w+/

位于表达式中的第4个位置


result = df.withColumn/'Employee', regexp_extract/col/'Notes'/, '/.//by//\s+//\w+/', 4//

result.show//

+----+--------------------+--------+
| ID| Notes|Employee|
+----+--------------------+--------+
|2345| Checked by John| John|
|2398| Verified by Stacy| Stacy|
|2328|Verified by Srini...|Srinivas|
|3983|Double Checked on...| Marsha|
+----+--------------------+--------+


https://databricks-prod-cloudf ... .html
笔记:


regexp_extract/col/'Notes'/, '.by\s+/\w+/', 1//

它似乎是一个更清洁的版本和
https://regex101.com/r/2lk6eV/3

莫问

赞同来自:

简短的

在最简单的形式和按照上述情况下,应该足够了,虽然 OP 如果有其他样本,必须在任何其他单词之前发布更多样本
by

.

代码

https://regex101.com/r/Qxfx0B/3
Regex


^/\w+/[ \t]*/.*\bby[ \t]+/\w+/[ \t]*.*/$


替换


\1\t\2\t\3


结果

输入


2345 Checked by John
2398 Verified by Stacy
3983 Double Checked on 2/23/17 by Marsha


出口


2345 Checked by John John
2398 Verified by Stacy Stacy
3983 Double Checked on 2/23/17 by Marsha Marsha


笔记:

上述结论将每个列划分为标签。
\t

, 因此,它看起来可能存在错误的肉眼,但只需使用在线解析器 regex 并插入
\t

在符合性部分 regex, 您必须在每个列所在的位置展示。 begins/ends.

解释

Regex


^

批准线头开始的位置


/\w+/

捕获一个或多个单词符号 /
a-zA-Z0-9_

/ 团体 1


[ \t]*

对应于任何数量的间隙或标签符号 /
[ \t]

可以被替换
\h

在一些实施例中 regex, 如 PCRE/


/.*\bby[ \t]+/\w+/[ \t]*.*/

抓住小组中的以下内容 2


.*

对应任何符号 /除了新字符串,如果不使用修饰符
s

/


\bby

对应于单词的边界
\b

, 后面的后面
by

字面上地


[ \t]+

匹配一个或多个间隙或标签字符


/\w+/

抓住一个或多个单词符号 /
a-zA-Z0-9_

/ 团体 3


[ \t]*

对应于任何数量的间隙或标签符号


.*

匹配任何次数的字符


$

批准线末端的位置

替换


\1

对应于最近比较了第一个Grate Group的相同文本


\t

标签符号


\1

对应于最近比较第二个拍卖组的相同文本


\t

标签符号


\1

对应于最近比较第三捕捉组的相同文本

诸葛浮云

赞同来自:

当我再次重读这个问题时, OP 可以谈谈一个固定的员工列表 /"让我们说,例如,有

只要 3 员工

, 必须检查哪个:John,Stacy或3月"/.
如果这是一个真正众所周知的列表,那么最简单的方法可以使用这个名字列表用单词的边界引用:


regexp_extract/col/'Notes'/, '\b/John|Stacy|Marsha/\b', 1/

窦买办

赞同来自:

这样的东西应该有效


import org.apache.spark.sql.functions._
dataFrame.withColumn/"Employee", substring_index/col/"Notes"/, "\t", 2//


如果您想使用 regex 要提取正确的值,您需要类似的东西


dataFrame.withColumn/"Employee", regexp_extract/col/"Notes"/, 'regex', <groupid>/


</groupid>

要回复问题请先登录注册