gpt4 book ai didi

python - 使用 udf 以编程方式从数据框中选择列

转载 作者:太空宇宙 更新时间:2023-11-03 20:45:26 25 4
gpt4 key购买 nike

我是 pyspark 新手。我正在尝试使用包含 UDF 的配置文件提取数据帧的列。如果我将选择列定义为客户端上的列表,则它可以工作,但如果我从配置文件导入列表,则列列表的类型为字符串。有没有替代方法。

使用 pyspark 打开 Spark-Shell 。

*******************************************************************
version 2.2.0
Using Python version 2.7.16 (default, Mar 18 2019 18:38:44)
SparkSession available as 'spark'

*******************************************************************


jsonDF = spark.read.json("/tmp/people.json")
jsonDF.show()

+----+-------+
| age| name|
+----+-------+
|null|Michael|
| 30| Andy|
| 19| Justin|
+----+-------+

jsonDF.printSchema()
root
|-- age: long (nullable = true)
|-- name: string (nullable = true)


jsonCurDF = jsonDF.filter(jsonDF.age.isNotNull()).cache()

# Define the UDF

from pyspark.sql.functions import udf
@udf("long")
def squared_udf(s):
return s * s


# Selecting the columns from a list.

colSelList = ['age', 'name', squared_udf('age')]
jsonCurDF.select(colSelList).show()

+---+------+----------------+
|age| name|squared_udf(age)|
+---+------+----------------+
| 30| Andy| 900|
| 19|Justin| 361|
+---+------+----------------+

# If I use an external config file

colSelListStr = ["age", "name" , "squared_udf('age')"]
jsonCurDF.select(colSelListStr).show()

上述命令失败“无法解析 '`squared_udf('age')'

尝试注册该函数,尝试 selectExpr 并使用列函数。

在 colSelList 中,udf 调用被转换为列类型。

print colSelList[2]
Column<squared_udf(age)

print colSelListStr[2]
squared_udf('age')

print column(colSelListStr[2])
Column<squared_udf('age')

我在这里做错了什么?或者有替代解决方案吗?

最佳答案

这是因为当您从列表传递 squared_age 时,它​​被视为字符串而不是函数。您可以通过一种圆形方法来执行此操作,并且无需为此导入 UDF。假设这是您需要选择的列表

enter image description here

直接传递此列表将导致错误,因为此数据框中不包含 squared_age

enter image description here

所以首先将现有 df 的所有列放入列表中

existing_cols = df.columns

enter image description here

这些是您需要的列 enter image description here

现在取两个列表的交集它会给你一个通用元素列表

intersection = list(set(existing_cols) & set(col_list)) 

现在尝试这样

newDF= df.select(intersection).rdd.map(lambda x: (x["age"], x["name"], x["age"]*x["age"])).toDF(col_list)

这会给你这个

enter image description here

希望这有帮助。

关于python - 使用 udf 以编程方式从数据框中选择列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56641690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com