如何拆分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
相关产品推荐
相关产品推荐

