清理 pyspark 数据框中的列值
sanitize column values in pyspark dataframe
给定 CSV 文件,我使用如下代码转换为 Dataframe。
raw_df = spark.read.csv(input_data, header=True)
创建的数据框看起来像这样:
| Name |
========
| 23 |
| hi2 |
| me3 |
| do |
我想将此列转换为仅包含数字。最终结果应该像 hi
和 me
被删除的地方:
| 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|
+----+----------+
给定 CSV 文件,我使用如下代码转换为 Dataframe。
raw_df = spark.read.csv(input_data, header=True)
创建的数据框看起来像这样:
| Name |
========
| 23 |
| hi2 |
| me3 |
| do |
我想将此列转换为仅包含数字。最终结果应该像 hi
和 me
被删除的地方:
| 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|
+----+----------+