我不知道为什么这个函数没有在pysaprk.sql.functions 模块中作为 api 公开。
SparkSQL 支持 substring 函数,无需定义 len 参数 substring(str, pos, len)
您可以将它与functions 模块的expr api 一起使用,如下所示:
df.withColumn('substr_name', f.expr("substring(name, 2)")).show()
+----------+---+-----------+
| name| id|substr_name|
+----------+---+-----------+
|Alex Shtof| 1| lex Shtof|
| SMaZ| 2| MaZ|
+----------+---+-----------+
spark 在内部是如何做到的:
现在,如果您看到上述语句的physical plan,那么会注意到如果我们不通过len,那么spark 将自动添加2147483647。
正如@pault 在评论中所说,2147483647 是 32 位有符号二进制整数 (2^31 -1) 的最大正值。
df.withColumn('substr_name', f.expr("substring(name, 2)")).explain()
== Physical Plan ==
*Project [name#140, id#141L, substring(name#140, 2, 2147483647) AS substr_name#169]
+- Scan ExistingRDD[name#140,id#141L] --> 2147483647 is automatically added
在functions 模块的substring api 实现中,它希望我们显式传递长度。如果你愿意,你可以在len 中给出任何更高的数字,它可以覆盖你的列的最大长度。
df.withColumn('substr_name', f.substring('name', 2, 100)).show()
+----------+---+-----------+
| name| id|substr_name|
+----------+---+-----------+
|Alex Shtof| 1| lex Shtof|
| SMaZ| 2| MaZ|
+----------+---+-----------+
>>> df.withColumn('substr_name', f.substring('name', 2, 100)).explain()
== Physical Plan ==
*Project [name#140, id#141L, substring(name#140, 2, 100) AS substr_name#189]
+- Scan ExistingRDD[name#140,id#141L] --> 100 is what we passed