You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PySpark如何从DataFrame中分离字符串/整数/浮点数值?

Spark DataFrame按类型过滤字符串、整数、浮点数的解决方案

你的原始DataFrame看起来是这样的(列存储为字符串类型):

+---------+
|col_str_1|
+---------+
| 1|
| 2|
| 3|
| 4|
| 5|
| 6|
| 7|
| 8|
| 9|
| a|
| b|
| c|
| d|
| e|
| f|
| g|
| h|
| 1|
| 2|
| 3.0|
+---------+

你已经拿到了DataFrame和目标列名,接下来用filter就可以完美实现需求——毕竟我们要做的是筛选符合类型的行,而map是用来转换每行数据的,filter在DataFrame上的执行效率也更高。下面分三种需求给出具体代码:

1. 筛选STRING类型的行

我们需要过滤掉所有数字(整数和浮点数),只保留纯字母字符串。可以用正则表达式匹配非数字内容:

df = sqlContext.sql('select * from --db--.vt_prof_test')
columns = df.columns[0]

# 筛选非数字的字符串行
string_df = df.filter(~df[columns].rlike('^\\d+(\\.\\d+)?$'))
string_df.show()

执行后会得到你想要的纯字母结果:

+---------+
|col_str_1|
+---------+
| a|
| b|
| c|
| d|
| e|
| f|
| g|
| h|
+---------+

正则说明:^\d+(\.\d+)?$ 匹配整数或浮点数,~表示取反,也就是保留不匹配该规则的行。

2. 筛选Integer类型的行

我们需要保留纯整数形式的字符串(排除带小数点的数值,比如3.0),用正则匹配纯数字:

# 筛选纯整数行
integer_df = df.filter(df[columns].rlike('^\\d+$'))
integer_df.show()

执行后会得到所有纯整数的行:

+---------+
|col_str_1|
+---------+
| 1|
| 2|
| 3|
| 4|
| 5|
| 6|
| 7|
| 8|
| 9|
| 1|
| 2|
+---------+

正则说明:^\d+$ 匹配仅由数字组成的字符串,不会匹配带小数点的内容。

3. 筛选Float类型的行(可选)

如果需要筛选带小数点的浮点数行,用正则匹配带小数点的数字:

# 筛选浮点数行
float_df = df.filter(df[columns].rlike('^\\d+\\.\\d+$'))
float_df.show()

执行后会得到3.0这一行。

补充说明

  • 这些方法基于你的列是字符串类型的前提(从你的例子来看确实如此),如果列是混合类型,建议先将列转换为字符串再执行过滤:df = df.withColumn(columns, df[columns].cast("string"))
  • 相比自定义UDF,正则表达式的方式更简洁高效,不需要额外定义函数。

内容的提问来源于stack exchange,提问作者Vikram Taori

火山引擎 最新活动