Databricks中UDF输出错误

2024-09-29 21:44:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我想添加一个名为academics_category的新专栏,其中包含学位和非学位的价值观。 我创建了一个udf函数,它检查一个成长标准(教育)是否与学位匹配

问题是,输出中的每个值都不是学位。

from pyspark.sql.types import *

def academics_category(academics):
  if academics == "Bachelors":
    return "academic degree"
  elif academics == "Masters":
    return "academic degree"
  else:
    return "no academic degree"
  
academics_udf = udf(academics_category,StringType())
dfAdult = dfAdult.withColumn('academics_category',academics_udf(dfAdult['bildungsstand']))


bildung = dfAdult.groupBy('bildungsstand','bildungslevel').count().sort('bildungslevel').show(20)

+-------------+-------------+-----+
|bildungsstand|bildungslevel|count|
+-------------+-------------+-----+
|    Preschool|          1.0|   51|
|      1st-4th|          2.0|  168|
|      5th-6th|          3.0|  333|
|      7th-8th|          4.0|  646|
|          9th|          5.0|  514|
|         10th|          6.0|  933|
|         11th|          7.0| 1175|
|         12th|          8.0|  433|
|      HS-grad|          9.0|10501|
| Some-college|         10.0| 7291|
|    Assoc-voc|         11.0| 1382|
|   Assoc-acdm|         12.0| 1067|
|    Bachelors|         13.0| 5355|
|      Masters|         14.0| 1723|
|  Prof-school|         15.0|  576|
|    Doctorate|         16.0|  413|
+-------------+-------------+-----+

Tags: returncountcategoryacademic学位udfmasters专栏
2条回答

UDF不是非常理想的解决方案,尤其是对于Python来说——主要是因为需要在JVM和Python之间发送数据。只有在必要时,才建议使用从性能角度来看更好的Pandas UDFs

但在您的情况下,您可以像这样使用内置的^{} function

>>> from pyspark.sql.functions import when,col
>>> df = spark.createDataFrame([("Bachelors", 13.0), 
       ("Masters", 14.0), ("Preschool", 1.0)], 
       schema=["bildungsstand", "bildungslevel"])
>>> df2 = df.withColumn("academics_category", 
   when((col("bildungsstand") == "Bachelors") | (col("bildungsstand") == "Masters"), 
      "academic degree").otherwise("no academic degree"))
>>> df2.show()
+      -+      -+         +
|bildungsstand|bildungslevel|academics_category|
+      -+      -+         +
|    Bachelors|         13.0|   academic degree|
|      Masters|         14.0|   academic degree|
|    Preschool|          1.0|no academic degree|
+      -+      -+         +

注意,您需要使用|作为or运算符,使用&作为and运算符,使用~作为not运算符

SparkByExamples有很多good description of this function

但是如果您确实有固定的值列表,那么使用^{} function检查值是否在给定值列表中更容易:

另外,我建议大家学习Spark,2ed,它会给你很好的介绍Spark,它的功能,等等

>>> from pyspark.sql.functions import col
>>> df = spark.createDataFrame([("Bachelors", 13.0), ("Masters", 14.0), ("Preschool", 1.0)], schema=["bildungsstand", "bildungslevel"])
>>> df2 = df.withColumn("academics_category", 
  when(col("bildungsstand").isin(["Bachelors","Masters"]), 
    "academic degree").otherwise("no academic degree"))
>>> df2.show()
+      -+      -+         +
|bildungsstand|bildungslevel|academics_category|
+      -+      -+         +
|    Bachelors|         13.0|   academic degree|
|      Masters|         14.0|   academic degree|
|    Preschool|          1.0|no academic degree|
+      -+      -+         +

我在我的案例中发现了问题。根数据集的字符串值中有空格。我用trim函数替换了空格,并创建了一个新的数据框

dfAdult = dfAdult.withColumn("bildungsstand_trim",trim(col="bildungsstand"))

相关问题 更多 >

    热门问题