You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何拆分PySpark DataFrame中存储元组列表的列

拆分PySpark DataFrame中的元组列表列

没问题,我来帮你搞定这个需求!首先得先把你提供的DataFrame创建代码修正一下——原来的写法会把每个元组当成单独的列,而不是把它们放到一个列表里作为Tokens列的值。先看正确的创建方式:

from pyspark.sql import SparkSession
from pyspark.sql.functions import expr

# 初始化SparkSession
spark = SparkSession.builder.appName("TupleSplit").getOrCreate()
sqlCtx = spark.sqlContext

# 正确创建包含元组列表的DataFrame
df = sqlCtx.createDataFrame(
    [
        (1, [('blue', 0.5), ('red', 0.1), ('green', 0.7)]),
        (2, [('red', 0.9), ('cyan', 0.5), ('white', 0.4)])
    ],
    ('Topic', 'Tokens')
)

df.show(truncate=False)

这段代码执行后,输入的DataFrame才会符合你描述的结构:

+-----+-------------------------------------------+
|Topic|Tokens                                     |
+-----+-------------------------------------------+
|1    |[(blue, 0.5), (red, 0.1), (green, 0.7)]    |
|2    |[(red, 0.9), (cyan, 0.5), (white, 0.4)]    |
+-----+-------------------------------------------+

接下来就是拆分Tokens列了,我们可以用PySpark的**内置高阶函数transform**来实现,不需要写UDF(用户自定义函数),这样效率更高:

# 拆分出词元和权重列
result_df = df.withColumn("词元", expr("transform(Tokens, t -> t._1)")) \
              .withColumn("权重", expr("transform(Tokens, t -> t._2)")) \
              .select("Topic", "词元", "权重")

# 重命名Topic列为中文"主题"
result_df = result_df.withColumnRenamed("Topic", "主题")

result_df.show(truncate=False)

执行这段代码后,就能得到你期望的输出:

+-----+--------------------------+-----------------+
|主题 |词元                      |权重             |
+-----+--------------------------+-----------------+
|1    |[blue, red, green]        |[0.5, 0.1, 0.7]  |
|2    |[red, cyan, white]        |[0.9, 0.5, 0.4]  |
+-----+--------------------------+-----------------+

代码解释

  • transform(Tokens, t -> t._1):遍历Tokens列中的每个元组t,提取元组的第一个元素(词元),并组成一个新的列表
  • transform(Tokens, t -> t._2):同理,提取每个元组的第二个元素(权重)组成列表
  • 最后我们把Topic列重命名为中文的"主题",并选择需要的列展示

内容的提问来源于stack exchange,提问作者goutham007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:08:43