如何检查pyspark数据框中的字符串列是否都是数字

cph*_*sto 11 python numeric pyspark

我有一个Dataframe带有strings. 如何检查其中的哪些行是数字。我在 PySpark 的官方文档中找不到任何功能-

values = [('25q36',),('75647',),('13864',),('8758K',),('07645',)]
df = sqlContext.createDataFrame(values,['ID',])
df.show()
+-----+
|   ID|
+-----+
|25q36|
|75647|
|13864|
|8758K|
|07645|
+-----+
Run Code Online (Sandbox Code Playgroud)

在 Python 中,有一个函数.isDigit()可以返回True或者False是否string只包含数字。

预期数据帧 -

+-----+-------+
|   ID| Value |
+-----+-------+
|25q36| False |
|75647| True  |
|13864| True  |
|8758K| False |
|07645| True  |
+-----+-------+
Run Code Online (Sandbox Code Playgroud)

我想避免创建一个UDF.

Ste*_*ven 20

一个简单的演员就可以完成这项工作:

from pyspark.sql import functions as F

my_df.select(
  "ID",
  F.col("ID").cast("int").isNotNull().alias("Value ")
).show()

+-----+------+
|   ID|Value |
+-----+------+
|25q36| false|
|75647|  true|
|13864|  true|
|8758K| false|
|07645|  true|
+-----+------+
Run Code Online (Sandbox Code Playgroud)


Moh*_*lla 5

我同意@steven 的回答,但有一点修改,因为我希望过滤掉整个表。全氟硼酸

df2.filter(F.col("id").cast("int").isNotNull()).show()
Run Code Online (Sandbox Code Playgroud)

也不需要创建一个名为Values的新列


与上面类似的替代解决方案是 -

display(df2.filter(f"CAST({'id'} as INT) IS NOT NULL")
Run Code Online (Sandbox Code Playgroud)


Moh*_*our 5

使用正则表达式过滤

事实上,我很喜欢史蒂文提供的创造性解决方案,但对于这种情况,我有一个更简单的建议:

df.filter(~df.ID.rlike('\D+')).show()
Run Code Online (Sandbox Code Playgroud)

首先,选择包含非数字字符的每一行rlike('\D+'),然后排除~过滤器开头的那些行。