【问题标题】:remove rows from pyspark dataframe by type按类型从 pyspark 数据框中删除行
【发布时间】:2020-09-03 10:32:31
【问题描述】:

我在 pyspark 中有包含产品项目的大文件,其中一些是确切的数字,其他包含字符串。 我想从数据框中删除所有带有数字的行项目(计算效率高)。

|Product-1| Pj3f|
|Product-2| 12  |
|Product-3| Pj2F|
|Product-4| 20  |

如何按 pyspark 数据框列中的项目类型过滤行? pyspark 过滤器功能似乎没有它的功能。

k

【问题讨论】:

    标签: dataframe apache-spark filter pyspark


    【解决方案1】:

    cast 列到 int 然后只过滤 null 值列。

    • 或者使用.rlike函数

    Example:

    df.show()
    #+---------+-----+
    #|  product|descr|
    #+---------+-----+
    #|Product-1| pj3f|
    #|product-2|   12|
    #+---------+-----+
    
    df.filter(col("descr").cast("int").isNull()).show()
    df.filter(~col("descr").rlike("^([\s\d]+)$")).show()
    #+---------+-----+
    #|  product|descr|
    #+---------+-----+
    #|Product-1| pj3f|
    #+---------+-----+
    

    【讨论】:

    【解决方案2】:

    spark 中的列都是相同类型的。如果您将两列与 union 混合在一起,例如不同类型的,spark 将尝试转换为两者的有效类型,通常是 String,并将值的字符串表示形式。

    例子:

    • String 列和Float 将生成String 列,浮点数以小数点表示的字符串表示。 String + Float => String
    • Integer 列联合和Float 会将所有整数转换为浮点数。 Integer + Float => Float

    根据您的情况,如果它是主题字符串或数字,我会选择 regex 过滤。

    val stringsDF = df.filter(regex_extract($"column", "[0-9]+([.|,][0-9]+)?") === ""))
    

    这将保留所有不跟随浮点或整数值的值。

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 2017-11-26
      • 2023-04-07
      相关资源
      最近更新 更多