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




