PySpark DataFrame select中使用变量调用substring函数报错如何解决
报错原因解析
- 第一个写法报错:根本原因是
alias()方法的调用位置错误。select()方法返回的是DataFrame对象,DataFrame的alias()是给整张表起别名,不支持直接给列设置别名,你之前把alias()写在了select()的外面,导致调用逻辑错误,才触发了类型报错。substring方法本身是支持第二个参数传本地Python整数、第三个参数传列对象的,参数本身是合法的。 - 第二个写法报错:你直接在
expr()的SQL表达式字符串里写了Python变量名StringStartPoint,Spark解析SQL的时候会把它识别为DataFrame的字段名去匹配,找不到对应字段就触发了解析异常。
正确写法
写法1:直接使用substring工具函数(推荐)
只需要调整alias()的位置,放到substring的返回结果后面即可:
from pyspark.sql import functions as f StringStartPoint = 10 df2 = df1.select( f.substring(f.col("CompleteLine"), StringStartPoint, f.col("StringLength")).alias('MySubString') )
写法2:使用expr表达式
用Python f-string把本地变量的值插值到SQL表达式字符串里即可,列名可以直接写在表达式中,不需要额外套col():
from pyspark.sql import functions as f StringStartPoint = 10 df2 = df1.select( f.expr(f"substring(CompleteLine, {StringStartPoint}, StringLength)").alias('MySubString') )
扩展说明
如果后续需要在SQL表达式中传入多个本地变量,都可以用f-string插值的方式处理,注意数值类型可以直接插值,字符串类型的变量需要额外加引号包裹即可。
内容的提问来源于stack exchange,提问作者iamaj
相关产品推荐
相关产品推荐

