清理 pyspark 数据框中的列值

sanitize column values in pyspark dataframe

给定 CSV 文件,我使用如下代码转换为 Dataframe。

raw_df = spark.read.csv(input_data, header=True)

创建的数据框看起来像这样:

| Name |
========
|  23  |
|  hi2 |
|  me3 |
|  do  |

我想将此列转换为仅包含数字。最终结果应该像 hime 被删除的地方:

| Name |
========
|  23  |
|   2  |
|   3  |
|  do  |

我想清理值并确保它只包含数字。但我不确定在 Spark 中是否可行。

是的,这是可能的。您可以在函数中使用 regex_replace

请检查:

import pyspark.sql.functions as f

df = spark.sparkContext.parallelize([('12',), ('hi2',), ('me3',)]).toDF(["name"])

df.show()
+----+
|name|
+----+
|  12|
| hi2|
| me3|
+----+

final_df = df.withColumn('sanitize', f.regexp_replace('name', '[a-zA-Z]', '')) 

final_df.show()
+----+--------+
|name|sanitize|
+----+--------+
|  12|      12|
| hi2|       2|
| me3|       3|
+----+--------+

final_df.withColumn('len', f.length('sanitize')).show()
+----+--------+---+
|name|sanitize|len|
+----+--------+---+
|  12|      12|  2|
| hi2|       2|  1|
| me3|       3|  1|
+----+--------+---+

您可以调整正则表达式。

否则也一样。这只是另一种方式,但如果可用,最好使用 spark 内置函数。也如上图。

from pyspark.sql.functions import udf
import re
user_func =  udf (lambda x: re.findall("\d+", x)[0])
newdf = df.withColumn('new_column',user_func(df.Name))

>>> newdf.show()
+----+----------+
|Name|new_column|
+----+----------+
|  23|        23|
| hi2|         2|
| me3|         3|
+----+----------+