Вы можете собрать столбцы V1
, V2
и V3
как struct
и передать функцию udf
с помощью столбца top
и извлечь значение как
scala
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
, чтобы вам не приходилось жестко их кодировать.
Надеюсь, ответ будет полезным