【问题标题】: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 值列。
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]+)?") === ""))
这将保留所有不跟随浮点或整数值的值。