我有这种格式的PySpark DataFrame:
dbn | bus | subway | score
----------|----------------|----------|--------
XYZ12 | B1, B44, B66 | A, C | 59
ZYY3 | B8, B3, B7 | J, Z | 66
我想要做的是能够将得分列附加到每个单独的公共汽车和地铁线路,但是我希望一次只能在一列上工作,所以我将从公共汽车开始。最终我希望我的DataFrame看起来像这样(当我使用总线列时)
dbn | bus | subway | score
---------|-----------|---------|-------
XYZ12 | B1 | A, C | 59
XYZ12 | B44 | A, C | 59
XYZ12 | B66 | A, C | 59
ZYY3 | B8 | J, Z | 66
ZYY3 | B3 | J, Z | 66
ZYY3 | B7 | J, Z | 66
我将如何做到这一点?
答案 0 :(得分:0)
您可以explode
函数将array
或map
列作为输入。如果bus
是一个字符串,您可以使用字符串处理函数(如split
)将其分解为片段。让我们假设这种情况:
df = sc.parallelize([
("XYZ12", "B1, B44, B66", "A, C", 59),
("ZYY3 ", "B8, B3, B7", "J, Z", 66)
]).toDF(["dbn", "bus", "subway", "score"])
首先导入所需的功能:
from pyspark.sql.functions import col, explode, split, trim
添加列:
with_bus_exploded = df.withColumn("bus", explode(split("bus", ",")))
和trim
前导/尾随空格:
with_bus_trimmed = with_bus_exploded.withColumn("bus", trim(col("bus")))
最后结果是:
+-----+---+------+-----+
| dbn|bus|subway|score|
+-----+---+------+-----+
|XYZ12| B1| A, C| 59|
|XYZ12|B44| A, C| 59|
|XYZ12|B66| A, C| 59|
|ZYY3 | B8| J, Z| 66|
|ZYY3 | B3| J, Z| 66|
|ZYY3 | B7| J, Z| 66|
+-----+---+------+-----+