Pyspark映射正则表达式

时间:2020-07-07 10:50:59

标签: python apache-spark pyspark apache-spark-sql

我有一个带有文本列的pyspark数据框。

  1. 我想用正则表达式映射值。
    df = df.withColumn('mapped_col', regexp_replace('mapped_col', '.*-RH', 'RH'))
    df = df.withColumn('mapped_col', regexp_replace('mapped_col', '.*-FI, 'FI'))
  1. 此外,我想根据字典映射特定值,我做了以下工作(映射器来自create_map()):
     df = df.withColumn("mapped_col",mapper.getItem(F.col("action")))
  1. 最后,未由字典或正则表达式表达式映射的值将设置为null。我不知道如何按照另外两个来做这部分。

是否有可能像正则表达式的字典一样,以便我可以重新组合两个“函数”? {“。*-RH”:“ RH”,“。* FI”:“ FI”}

原始输出示例

+-----------------------------+
|message                      |
+-----------------------------+
|GDF2009                      | 
|GDF2014                      |
|ADS-set                      |
|ADS-set                      |
|XSQXQXQSDZADAA5454546a45a4-FI|
|dadaccpjpifjpsjfefspolamml-FI|
|dqdazdaapijiejoajojp565656-RH|
|kijipiadoa
+-----------------------------+

预期的输出示例

+-----------------------------+-----------------------------+
|message                      |status|
+-----------------------------+-----------------------------+
|GDF2009                      | GDF
|GDF2014                      | GDF
|ADS/set                      | ADS
|ADS-set                      | ADS 
|XSQXQXQSDZADAA5454546a45a4-FI| FI
|dadaccpjpifjpsjfefspolamml-FI| FI
|dqdazdaapijiejoajojp565656-RH| RH
|kijipiadoa                   | null or ??

因此,第4行用dict映射,另一行使用regex映射。未映射的是null或?? 谢谢

1 个答案:

答案 0 :(得分:1)

您可以使用contains函数来实现它:

from pyspark.sql.types import StringType

df = spark.createDataFrame(
    ["GDF2009", "GDF2014", "ADS-set", "ADS-set", "XSQXQXQSDZADAA5454546a45a4-FI", "dadaccpjpifjpsjfefspolamml-FI",
     "dqdazdaapijiejoajojp565656-RH", "kijipiadoa"], StringType()).toDF("message")
df.show()

names = ("GDF", "ADS", "FI", "RH")

def c(col, names):
    return [f.when(f.col(col).contains(i), i).otherwise("") for i in names]

df.select("message", f.concat_ws("", f.array_remove(f.array(*c("message", names)), "")).alias("status")).show()

输出:

+--------------------+
|             message|
+--------------------+
|             GDF2009|
|             GDF2014|
|             ADS-set|
|             ADS-set|
|XSQXQXQSDZADAA545...|
|dadaccpjpifjpsjfe...|
|dqdazdaapijiejoaj...|
|          kijipiadoa|
+--------------------+

+--------------------+------+
|             message|status|
+--------------------+------+
|             GDF2009|   GDF|
|             GDF2014|   GDF|
|             ADS-set|   ADS|
|             ADS-set|   ADS|
|XSQXQXQSDZADAA545...|    FI|
|dadaccpjpifjpsjfe...|    FI|
|dqdazdaapijiejoaj...|    RH|
|          kijipiadoa|      |
+--------------------+------+