Сумма MySQL по окну, содержащему нулевое значение, возвращает нулевое

Вот простой пример

from pandas import DataFrame

# Create data set
d = {'Revenue':[100,111,222], 
     'Cost':[333,444,555]}
df = DataFrame(d)


# mask = Return True when the value in column "Revenue" is equal to 111
mask = df['Revenue'] == 111

print mask

# Result:
# 0    False
# 1     True
# 2    False
# Name: Revenue, dtype: bool


# Select * FROM df WHERE Revenue = 111
df[mask]

# Result:
#    Cost    Revenue
# 1  444     111
1
задан Barmar 18 January 2019 в 16:50
поделиться

2 ответа

Это Apache Spark, мой плохой! (Я работаю в Databricks, и я думал, что это MySQL под капотом). Не слишком ли поздно менять название?

@Barmar, вы правы в том, что IFNULL() не относится к NaN как null. Мне удалось выяснить исправление благодаря @ user6910411 отсюда: SO link . Я должен был изменить numy NaNs, чтобы зажечь нули. Правильный код после образца df_pd создан:

spark_df = spark.createDataFrame(df_pd)

from pyspark.sql.functions import isnan, col, when

#this converts all NaNs in numeric columns to null:
spark_df = spark_df.select([
    when(~isnan(c), col(c)).alias(c) if t in ("double", "float") else c 
    for c, t in spark_df.dtypes])

spark_df.createOrReplaceTempView('df_sql')

df_out = sqlContext.sql("""
select *, (sum(ifnull(Revenue,0)) over (partition by Client
  order by Client,Month
  rows between 3 preceding and 1 preceding)) as Total_Sum3
  from df_sql order by Client,Month
  """)
df_out.show()

, который затем дает желаемое:

+------+------+-------+----------+
|Client| Month|Revenue|Total_Sum3|
+------+------+-------+----------+
|     A|201701|  100.0|      null|
|     A|201702|  101.0|     100.0|
|     A|201703|  102.0|     201.0|
|     A|201704|  103.0|     303.0|
|     A|201705|  104.0|     306.0|
|     B|201701|  201.0|      null|
|     B|201702|   null|     201.0|
|     B|201703|  203.0|     201.0|
|     B|201704|  204.0|     404.0|
|     B|201705|  205.0|     407.0|
|     B|201706|  206.0|     612.0|
|     B|201707|  207.0|     615.0|
+------+------+-------+----------+

Является ли sqlContext лучшим способом приблизиться к этому или будет лучше / больше элегантно ли добиться того же результата через pyspark.sql.window?

0
ответ дан GivenX 18 January 2019 в 16:50
поделиться

Всего coalesce вне суммы:

df_out = sqlContext.sql("""
  select *, coalesce(sum(Revenue) over (partition by Client
  order by Client,Month
  rows between 3 preceding and 1 preceding)), 0) as Total_Sum3
  from df_sql
 """)
0
ответ дан user10934626 18 January 2019 в 16:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: