首页 > 解决方案 > 通过从另一列解析字符串来创建列

问题描述

我有两个想要加入的数据框。

一个数据框是这样的,其中syscode_ntwrk被破折号分割。

spark.createDataFrame(
    [
        (1, '1234 - ESPN'), 
        (2, '1234 - ESPN'),
        (3, '963 - CNN'), 
        (4, '963 - CNN'),
    ],
    ['id', 'col1'] 
)

而另一种就是这种格式, wheresyscode_ntwrk是串联在一起的。

spark.createDataFrame(
    [
        (100, '1234ESPN'), 
        (297, '1234ESPN'),
        (3989, '963CNN'), 
        (478, '963CNN'),
    ],
    ['counts', 'col1'] 
)

在第二个数据框中有没有办法创建一个新列来匹配第一个数据框syscode_ntwrkSyscode将始终是一组数字,并且ntwrk始终是一组字母,那么是否有正则表达式可以在两者之间添加空格破折号空格?

标签: apache-sparkpysparkapache-spark-sql

解决方案


您可以使用regexp_extract提取组并使用concat_ws将组转换为您想要的。

import pyspark.sql.functions as F

df = spark.createDataFrame(
    [
        (100, '1234ESPN'), 
        (297, '1234ESPN'),
        (3989, '963CNN'), 
        (478, '963CNN'),
    ],
    ['counts', 'col1'] 
)

df.select(
    F.concat_ws(
        ' - ',
        F.regexp_extract('col1', '(\d+)([a-zA-Z]+)', 1),
        F.regexp_extract('col1', '(\d+)([a-zA-Z]+)', 2)
    ).alias('parsed')
).show()

+-----------+
|     parsed|
+-----------+
|1234 - ESPN|
|1234 - ESPN|
|  963 - CNN|
|  963 - CNN|
+-----------+

推荐阅读