pyspark Spark柱式铸入枢轴

smdnsysy  于 2022-11-21  发布在  Spark
关注(0)|答案(1)|浏览(132)

我有一个 Dataframe ,我想从2列创建透视表,我使用的问题标题列将有其值透视如下:年龄,年龄_数字,答案标题是值,我的问题是我想把答案标题的值放在一个列表中,我正在使用collect_list函数,但问题是我希望像age_numeric这样的新列是int的列表,而age列是字符串的列表,基于问题类型列,但当我尝试代码时,它总是给我一个字符串的列表,你知道怎么解决这个问题吗?
这是密码

y=output.groupby("sessionId").pivot("questionHeader").
agg(collect_list(when(col("questionType")=="numericAnswer",
col("answerHeader")
.cast("float")).when(col("questionType")!="numericAnswer",col("answerHeader"))))

这就是我得到的
| 会话标识|年龄|年龄_数字
| 一个|[“20-25年”]|[“20”]
| 三个|[“20-25年”]|[“20”]
这就是我想要的
| 会话标识|年龄|年龄_数字
| 一个|[“20-25年”]|[第二十条]
| 三个|[“20-25年”]|[第二十条]

omjgkv6w

omjgkv6w1#

如果您想要最后两行中的输出,则不需要透视,只需对这两列中的每一列执行groupby和collect_list。要获取Age_numeric的整数列表,请应用.cast(“array< int>“),或者在collect_list()之前更改Age_numeric列的类型。

复制数据
import pyspark.sql.functions as F
data = [(1, "20-25 years", "20"), (3, "20-25 years", "20")]
df = spark.createDataFrame(data, schema=["session_id", "Age", "Age_numeric"])
复制输出
df_out = (df.groupBy("session_id")
            .agg(F.collect_list("Age").alias("Age"), 
                 F.collect_list("Age_numeric")
                         .cast("array<int>") 
                         .alias("Age_numeric"))

相关问题