使用火花将每行中的值转换为新列

Posted

技术标签:

【中文标题】使用火花将每行中的值转换为新列【英文标题】:Converting values in each row into new column with spark 【发布时间】:2019-04-09 02:23:04 【问题描述】:

我正在使用 Python 中的 Spark 从 XML 文件创建数据框。 我想要做的是将每一行中的值转换为新列并制作虚拟变量。

这是一个例子。

输入:

 id  |         classes          |
-----+--------------------------+
 132 |  economics,engineering   |
 201 |  engineering             |
 123 |  sociology,philosophy    |
 222 |  philosophy              |
--------------------------------

输出:

 id  | economics | engineering | sociology | philosophy
-----+-----------+-------------+-----------+-----------
 132 |    1      |     1       |      0    |     0
 201 |    0      |     1       |      0    |     0
 123 |    0      |     0       |      1    |     1
 222 |    0      |     0       |      0    |     1
--------------------------------------------------------

【问题讨论】:

How to pivot DataFrame?的可能重复 【参考方案1】:

将列分解为多行 参考:Explode in PySpark

import pyspark.sql.functions as F

df = spark.createDataFrame([(132, "economics,engineering"),(201, "engineering"),(123, "sociology,philosophy"),(222, "philosophy")], ["id", "classes"])

+---+--------------------+
| id|             classes|
+---+--------------------+
|132|economics,enginee...|
|201|         engineering|
|123|sociology,philosophy|
|222|          philosophy|
+---+--------------------+


explodeCol = df.select(col("id"), F.explode(F.split(col("classes"), ",")).alias("branch"))
+---+-----------+
| id|     branch|
+---+-----------+
|132|  economics|
|132|engineering|
|201|engineering|
|123|  sociology|
|123| philosophy|
|222| philosophy|
+---+-----------+

explodeCol.groupBy("id").pivot("branch").agg(F.sum(lit(1))).na.fill(0).show()
+---+---------+-----------+----------+---------+
| id|economics|engineering|philosophy|sociology|
+---+---------+-----------+----------+---------+
|222|        0|          0|         1|        0|
|201|        0|          1|         0|        0|
|132|        1|          1|         0|        0|
|123|        0|          0|         1|        1|
+---+---------+-----------+----------+---------+

更详细的 Spark 文档参考http://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html

【讨论】:

以上是关于使用火花将每行中的值转换为新列的主要内容,如果未能解决你的问题,请参考以下文章

将列中的字符串集列表转换为新列

根据每个句子的第一个单词将 pandas 数据框列中的字符串列表分解为新列

以键为新列重塑键值对的火花数据框

如何将 CSV 值与 pyspark 数据框中的单元格中的值分别分隔为新列及其值

将火花数据框列中的值提取到新的派生列中

将来自一个数据框的值合并到 Pandas 中的新列中[重复]