Pyspark数据帧:根据另一列的值提取列

时间:2018-05-29 06:06:08

标签: apache-spark pyspark

我有一个包含以下列和相应值的数据框(原谅我的格式但不知道如何将其放在表格格式中):

Src_ip     dst_ip     V1     V2     V3     top
"A"         "B"       xx     yy     zz     "V1"

现在我要添加一个列,比如说top_value,它取与V1中字符串对应的列的值。

Src_ip     dst_ip     V1     V2     V3     top   top_value
"A"         "B"       xx     yy     zz     "V1"     xx

所以基本上,获取与“top”列中的值对应的值,并创建一个名为“top_value”的新列

我尝试过创建UDF以及将字符串用作别名但无法这样做。任何人都可以帮忙。

1 个答案:

答案 0 :(得分:2)

您可以将V1V2V3列收集为struct并传递到udf列,其中包含top列,提取值为

import org.apache.spark.sql.functions._
def findValueUdf = udf((strct: Row, top: String) => strct.getAs[String](top))

df.withColumn("top_value", findValueUdf(struct("V1", "V2", "V3"), col("top")))

应该给你

+------+------+---+---+---+---+---------+
|Src_ip|dst_ip|V1 |V2 |V3 |top|top_value|
+------+------+---+---+---+---+---------+
|A     |B     |xx |yy |zz |V1 |xx       |
+------+------+---+---+---+---+---------+

pyspark

pyspark中的等效代码将是

from pyspark.sql import functions as f
from pyspark.sql import types as t
def findValueUdf(strct, top):
    return strct[top]

FVUdf = f.udf(findValueUdf, t.StringType())

df.withColumn("top_value", FVUdf(f.struct("V1", "V2", "V3"), f.col("top")))

此外,您可以在列表中定义要在struct函数中使用的列名,这样您就不必对其进行硬编码。

我希望答案很有帮助