PySpark透视表列类型问题:如何让数值列存数值列表而非字符串?
问题解决方法
问题核心是Spark透视时,同一聚合逻辑下的不同类型会被统一为更宽泛的字符串类型,导致数值列表被强制转成字符串。解决思路是先按sessionId+questionHeader分组处理类型,再执行透视,确保每个分组内的类型统一,避免自动类型转换。
修正后的代码
from pyspark.sql import functions as F # 第一步:按sessionId和questionHeader分组,先处理类型再收集列表 grouped_df = output.groupBy("sessionId", "questionHeader").agg( F.collect_list( F.when(F.col("questionType") == "numericAnswer", F.col("answerHeader").cast("float")) .otherwise(F.col("answerHeader")) ).alias("values") ) # 第二步:基于分组结果执行透视 y = grouped_df.groupBy("sessionId").pivot("questionHeader").agg(F.first("values"))
原理说明
原写法直接在透视的聚合逻辑中混合了float和string类型,Spark会自动将所有结果统一为字符串类型(因为字符串兼容性更强)。而先按sessionId+questionHeader分组后,每个分组内的questionType是固定的(比如Age分组全为非数值类型,Age_numeric分组全为数值类型),此时collect_list得到的列表元素类型是正确的,后续透视时仅需提取该分组的列表即可保留原类型。
内容的提问来源于stack exchange,提问作者Marwan Zidane
相关产品推荐
相关产品推荐

