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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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以及使用字符串作为别名但无法这样做。谁能请帮忙。

答案

您可以将V1V2V3列收集为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函数中使用,这样您就不必对它们进行硬编码。

我希望答案是有帮助的

以上是关于Pyspark数据帧:根据另一列的值提取列的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark:如果具有特定 id 的任何行包含 null,如何根据另一列派生新列的值?

如何根据另一列的单元格值由其他列动态更新A列

Pyspark根据另一列的模式替换列中的字符串

Pyspark:如何根据另一列的值填充空值

pyspark:删除作为另一列值的子字符串,并从给定列的值中包含正则表达式字符

如何创建一列数组,其值来自一列并且它们的长度来自pyspark数据帧中的另一列?