Почему pyspark выбрасывает «объект Column» не вызывается »при попытке использования функции Window? - PullRequest
0 голосов
/ 01 июля 2019

метка выпуска: emr-5.24.0 Распределение Hadoop: Amazon 2.8.5 Приложения: Spark 2.4.2, Hive 2.3.4

Я пытаюсь получить количество отдельных моделей для каждого года, и этот счет отображается в виде отдельного столбца для каждой записи.

Начиная с:

prod_schema = StructType([
       StructField("model", StringType(), False),          
       StructField("year", StringType(), False),          
       StructField("price", IntegerType(), False),          
       StructField("mileage", IntegerType(), False)]   
       )

dumba = [("Galaxy", "2017", 21841, 17529), 
     ("Galaxy", "2017", 29395, 11892), 
     ("Novato", "2018", 35644, 22876), 
     ("Novato", "2017", 28864, 28286), 
     ("Tagur", "2016", 22761, 62551), 
     ("Tagur", "2011", 11952, 104222), 
     ("Tagur", "2017", 30552, 88045), 
     ("Mulion", "2015", 11054, 35644), 
     ("Mulion", "2018", 15275, 43871), 
     ("Mulion", "2016", 10684, 87112)]

 df = spark.createDataFrame(dumba, schema=prod_schema)
 df.show()

+------+----+-----+-------+
| model|year|price|mileage|
+------+----+-----+-------+
|Galaxy|2017|21841|  17529|
|Galaxy|2017|29395|  11892|
|Novato|2018|35644|  22876|
|Novato|2017|28864|  28286|
| Tagur|2016|22761|  62551|
| Tagur|2011|11952| 104222|
| Tagur|2017|30552|  88045|
|Mulion|2015|11054|  35644|
|Mulion|2018|15275|  43871|
|Mulion|2016|10684|  87112|
+------+----+-----+-------+

Я бы хотел добраться до:

+------+----+-----+-------+---------------+
| model|year|price|mileage|models_per_year|
+------+----+-----+-------+---------------+
|Galaxy|2017|21841|  17529|              3|
|Galaxy|2017|29395|  11892|              3|
|Novato|2018|35644|  22876|              2|
|Novato|2017|28864|  28286|              3|
| Tagur|2016|22761|  62551|              2|
| Tagur|2011|11952| 104222|              1|
| Tagur|2017|30552|  88045|              3|
|Mulion|2015|11054|  35644|              1|
|Mulion|2018|15275|  43871|              2|
|Mulion|2016|10684|  87112|              2|
+------+----+-----+-------+---------------+

Я получаю эту ошибку:

Traceback (most recent call last):
File "/home/hadoop/mon/dummy_df.py", line 39, in <module>
df.select(F.col("model").distinct().count())).over(w0)
TypeError: 'Column' object is not callable

При попытке выполнить следующий код:

w0 = Window.partitionBy('year')
df = df.withColumn('models_per_year',
           df.select("model").distinct().count())).over(w0)

Я не уверен, что пытается сообщить мне ошибка или как ее исправить, чтобы я мог выполнить эту операцию без использования groupBy (слишком дорого). У кого-нибудь есть предложения?

1 Ответ

0 голосов
/ 01 июля 2019

Насколько я знаю, невозможно избежать groupBy в вашем случае без потери точности, поскольку countDistinct в настоящее время не поддерживает оконные функции. Когда вы можете жить с некоторой неточностью, вы должны взглянуть на функцию приблизительно_число :

from pyspark.sql import Window
from pyspark.sql import functions as F

prod_schema = StructType([
       StructField("model", StringType(), False),          
       StructField("year", StringType(), False),          
       StructField("price", IntegerType(), False),          
       StructField("mileage", IntegerType(), False)]   
       )

dumba = [("Galaxy", "2017", 21841, 17529), 
     ("Galaxy", "2017", 29395, 11892), 
     ("Novato", "2018", 35644, 22876), 
     ("Novato", "2017", 28864, 28286), 
     ("Tagur", "2016", 22761, 62551), 
     ("Tagur", "2011", 11952, 104222), 
     ("Tagur", "2017", 30552, 88045), 
     ("Mulion", "2015", 11054, 35644), 
     ("Mulion", "2018", 15275, 43871), 
     ("Mulion", "2016", 10684, 87112)]

df = spark.createDataFrame(dumba, schema=prod_schema)

w0 = Window.partitionBy('year')
df = df.withColumn('models_per_year', F.approx_count_distinct('model', 0.02).over(w0))
df.show()

Выход:

+------+----+-----+-------+---------------+ 
| model|year|price|mileage|models_per_year| 
+------+----+-----+-------+---------------+ 
| Tagur|2016|22761|  62551|              2| 
|Mulion|2016|10684|  87112|              2| 
|Galaxy|2017|21841|  17529|              3| 
|Galaxy|2017|29395|  11892|              3| 
|Novato|2017|28864|  28286|              3| 
| Tagur|2017|30552|  88045|              3| 
|Novato|2018|35644|  22876|              2| 
|Mulion|2018|15275|  43871|              2| 
| Tagur|2011|11952| 104222|              1| 
|Mulion|2015|11054|  35644|              1| 
+------+----+-----+-------+---------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...