首页 文章

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

提问于
浏览
1

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

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 回答

  • 2

    您可以将 V1V2V3 列收集为 struct 并使用 top 列传递给 udf 函数并将值提取为

    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 函数中使用的列表中定义列名,这样您就不必对它们进行硬编码 .

    我希望答案是有帮助的

相关问题