【问题标题】:pyspark 'DataFrame' object has no attribute '_get_object_id'pyspark 'DataFrame' 对象没有属性 '_get_object_id'
【发布时间】:2019-12-13 06:34:20
【问题描述】:

我正在尝试运行一些代码,但出现错误:

“DataFrame”对象没有属性“_get_object_id”

代码:

items = [(1,12),(1,float('Nan')),(1,14),(1,10),(2,22),(2,20),(2,float('Nan')),(3,300),
         (3,float('Nan'))]

sc = spark.sparkContext
rdd = sc.parallelize(items)
df = rdd.toDF(["id", "col1"])

import pyspark.sql.functions as func
means = df.groupby("id").agg(func.mean("col1"))

# The error is thrown at this line
df = df.withColumn("col1", func.when((df["col1"].isNull()), means.where(func.col("id")==df["id"])).otherwise(func.col("col1"))) 

【问题讨论】:

  • 您不能在这样的函数中使用第二个数据框 - 请改用连接。

标签: python dataframe apache-spark pyspark


【解决方案1】:

您不能在函数内引用第二个 spark DataFrame,除非您使用连接。 IIUC,您可以执行以下操作以达到您想要的结果。

假设means 如下:

#means.show()
#+---+---------+
#| id|avg(col1)|
#+---+---------+
#|  1|     12.0|
#|  3|    300.0|
#|  2|     21.0|
#+---+---------+

id 列上加入dfmeans,然后应用您的when 条件

from pyspark.sql.functions import when

df.join(means, on="id")\
    .withColumn(
        "col1",
        when(
            (df["col1"].isNull()), 
            means["avg(col1)"]
        ).otherwise(df["col1"])
    )\
    .select(*df.columns)\
    .show()
#+---+-----+
#| id| col1|
#+---+-----+
#|  1| 12.0|
#|  1| 12.0|
#|  1| 14.0|
#|  1| 10.0|
#|  3|300.0|
#|  3|300.0|
#|  2| 21.0|
#|  2| 22.0|
#|  2| 20.0|
#+---+-----+

但在这种情况下,我实际上建议使用 Windowpyspark.sql.functions.mean

from pyspark.sql import Window
from pyspark.sql.functions import col, mean

df.withColumn(
    "col1",
    when(
        col("col1").isNull(), 
        mean("col1").over(Window.partitionBy("id"))
    ).otherwise(col("col1"))
).show()
#+---+-----+
#| id| col1|
#+---+-----+
#|  1| 12.0|
#|  1| 10.0|
#|  1| 12.0|
#|  1| 14.0|
#|  3|300.0|
#|  3|300.0|
#|  2| 22.0|
#|  2| 20.0|
#|  2| 21.0|
#+---+-----+

【讨论】:

    【解决方案2】:

    我认为您正在使用 Scala API,在其中使用 ()。 在 PySpark 中,请改用 []。

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 2017-01-15
      • 1970-01-01
      相关资源
      最近更新 更多