我有一个包含以下列和相应值的数据框(原谅我的格式但不知道如何将其放在表格格式中):
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以及将字符串用作别名但无法这样做。任何人都可以帮忙。
答案 0 :(得分:2)
您可以将V1
,V2
和V3
列收集为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中的等效代码将是
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
函数中使用的列名,这样您就不必对其进行硬编码。
我希望答案很有帮助