Spark DataFrame
не имеет строгого порядка, поэтому индексация не имеет смысла.Вместо этого мы используем SQL-подобный DSL.Здесь вы бы использовали where
(filter
) и select
.Если бы данные выглядели так:
import pandas as pd
import numpy as np
from pyspark.sql.functions import col, sum as sum_
np.random.seed(1)
df = pd.DataFrame({
c: np.random.randn(1000) for c in ["column_A", "column_B", "column_C"]
})
amount
было бы
amount
# 0.9334143225687774
и эквивалент Spark:
sdf = spark.createDataFrame(df)
(amount_, ) = (sdf
.where(sdf.column_A > 0.0)
.select(sum_(sdf.column_B * sdf.column_C) / sum_(sdf.column_C))
.first())
и результаты численно эквивалентны:
abs(amount - amount_)
# 1.1102230246251565e-16
Вы также можете использовать условные выражения:
from pyspark.sql.functions import when
pred = col("column_A") > 0.0
amount_expr = sum_(
when(pred, col("column_B")) * when(pred, col("column_C"))
) / sum_(when(pred, col("column_C")))
sdf.select(amount_expr).first()[0]
# 0.9334143225687773
, которые больше похожи на панд, но более многословны.