PySpark当when条件为真时拼接列变量生成指定字符串如何实现?
错误原因
你当前的写法直接将PySpark的Column对象放到Python f-string中做拼接,Python会直接调用Column类的__str__方法,得到的就是你看到的Column<'xxx'>格式的字符串,而不是取每行对应列的实际值来拼接。
另外你代码里拼接时错误引用了s_table字段,你预期输出里拼接的是s_name字段的值,这里也需要修正。
正确代码
from pyspark.sql import functions as f filters = filters.withColumn( "p3", f.when( (f.col("s_table") == "aaaaaa") & (f.col("t_cast").isNull()), f.col("s_name") ).when( (f.col("s_table") == "aaaaaa") & (f.col("t_cast") == True), # 用concat拼接固定字符串和列的实际值 f.concat( f.lit("CAST('"), f.col("s_name"), f.lit("' AS "), f.col("t_d"), f.lit(") AS '"), f.col("s_name"), f.lit("'") ) ) )
所有固定的字符串片段都要用lit()函数包裹转为PySpark的常量列,再和字段列用concat拼接,才能在每行计算时取对应行的字段值完成拼接,完全符合你的预期输出。
内容的提问来源于stack exchange,提问作者jake wong
相关产品推荐
相关产品推荐

