分解Pyspark DataFrame中的行

时间:2016-10-06 18:30:08

标签: python apache-spark dataframe pyspark apache-spark-sql

我有这种格式的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

我将如何做到这一点?

1 个答案:

答案 0 :(得分:0)

您可以explode函数将arraymap列作为输入。如果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|
+-----+---+------+-----+