【问题标题】:sanitize column values in pyspark dataframe清理 pyspark 数据框中的列值
【发布时间】:2020-01-04 05:11:48
【问题描述】:

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

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

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

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

我想将此列转换为仅包含数字。最终结果应该类似于删除hime 的位置:

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

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

【问题讨论】:

    标签: apache-spark pyspark pyspark-dataframes


    【解决方案1】:

    是的,这是可能的。您可以在函数中使用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|
    +----+--------+---+
    
    

    您可以调整正则表达式。

    【讨论】:

    • 这会在清理中添加不必要的空间(例如“12”而不是“12”)有没有更干净的方法来去除空间?
    • @harumomo503:已更新答案。删除了空字符串 $1。如果我们只是替换为'' 那么它不会添加任何东西。
    【解决方案2】:

    其他方式也一样。这只是另一种方式,但如果可用,最好使用 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|
    +----+----------+
    

    【讨论】:

      猜你喜欢
      • 2020-02-13
      • 2017-06-25
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      • 2020-09-22
      • 2017-09-03
      • 2017-04-29
      • 2020-04-28
      相关资源
      最近更新 更多