PySpark使用变量/字面量而非数据框作为函数参数时抛出异常求助
PySpark使用变量/字面量而非数据框作为函数参数时抛出异常求助
你遇到的这个问题真的是刚上手PySpark的小伙伴很容易踩的坑!我当初刚用PySpark的时候也犯过类似的错😂 先帮你拆解一下原因:
你看到的这个Py4JException: Method getnewargs([]) does not exist错误,本质是因为PySpark的substring这类函数(也就是pyspark.sql.functions里的大部分函数),都是专门为DataFrame的列操作设计的——它们接收的参数应该是列对象(比如df["列名"]或者col("列名")),而不是普通的Python字符串字面量或者变量。这些函数是用来在分布式数据集上做批量列处理的,不是用来单独处理单个字符串的工具函数。
接下来给你几个针对性的解决方案,看你具体需求选:
如果你只是要处理单个字符串/变量:用Python原生操作就行
完全没必要动用PySpark的函数,Python自带的字符串切片简单又高效:
# 直接处理字面量 objectName = "fullFieldString"[:4] # 结果就是"full" # 处理变量的情况 my_string = "fullFieldString" objectName = my_string[:4]
如果你是要在DataFrame里处理列:正确用PySpark函数
这才是PySpark函数的正确打开方式,把函数作用在列对象上就行:
from pyspark.sql.functions import substring, col # 先模拟一个你的DataFrame例子 df = spark.createDataFrame([("fullFieldString",), ("testString123",)], ["fullFieldString"]) # 方法1:直接传列名字符串 df_result = df.withColumn("short_name", substring("fullFieldString", 1, 4)) # 方法2:用col函数指定列(更推荐,复杂场景下可读性更强) df_result = df.withColumn("short_name", substring(col("fullFieldString"), 1, 4)) # 查看处理后的结果 df_result.show()
运行后会生成一个新列short_name,对应的值分别是full和test。
特殊情况:非要用PySpark函数处理单个值(不推荐)
如果因为某些特殊需求必须这么做,也可以把单个值包装成临时DataFrame来处理,但真的没必要多此一举:
from pyspark.sql.functions import substring # 创建临时DataFrame存单个值 temp_df = spark.createDataFrame([("fullFieldString",)], ["temp_col"]) # 调用函数并提取结果 objectName = temp_df.select(substring("temp_col", 1, 4)).collect()[0][0] print(objectName) # 输出"full"
备注:内容来源于stack exchange,提问作者misiek8v
相关产品推荐
相关产品推荐

