PySpark DataFrame按字母序拼接两列生成新列问题求助
嘿,这个需求用PySpark的内置函数就能轻松搞定,给你两种可行的方法:
方法一:数组排序拼接(最简洁)
这是最推荐的方式,利用数组相关函数一步到位:
- 用
array()把Col1和Col2打包成一个数组 - 用
sort_array()对数组按字典序(也就是你要的字母顺序)升序排序 - 用
concat_ws()把排序后的数组元素无缝拼接成字符串
完整代码示例:
from pyspark.sql import functions as F # 假设你的原始DataFrame名为df df = df.withColumn( "NewCol", F.concat_ws("", F.sort_array(F.array(F.col("Col1"), F.col("Col2")))) ) # 查看结果 df.show()
运行后就能得到你想要的输出:
+------+------+--------+ | Col1 | Col2 | NewCol | +------+------+--------+ | ORD | DFW | DFWORD | | CUN | MCI | CUNMCI | | LAX | JFK | JFKLAX | +------+------+--------+
方法二:条件判断拼接(逻辑更直观)
如果你想更清晰地控制排序逻辑,也可以通过直接比较两列的字符串大小来决定拼接顺序:
from pyspark.sql import functions as F df = df.withColumn( "NewCol", F.when(F.col("Col1") < F.col("Col2"), F.concat(F.col("Col1"), F.col("Col2"))) .otherwise(F.concat(F.col("Col2"), F.col("Col1"))) ) df.show()
这个方法的逻辑很直白:如果Col1的字母顺序在Col2之前,就拼接Col1+Col2,否则就反过来拼接Col2+Col1,结果和方法一完全一致。
小提示
sort_array()默认是升序排序,刚好匹配字母顺序需求;如果需要降序,只需要加第二个参数asc=False- 字符串比较是基于Unicode编码的,对于英文字母来说就是标准字典序,完全符合你的示例要求
- 如果你的列中存在空值,可以用
coalesce()处理,比如array(F.coalesce(F.col("Col1"), ""), F.coalesce(F.col("Col2"), "")),避免空值影响排序结果
内容的提问来源于stack exchange,提问作者dandroid
相关产品推荐
相关产品推荐

