![](/img/trans.png)
[英]Write a pyspark.sql.dataframe.DataFrame without losing information
[英]How to write this pandas logic for pyspark.sql.dataframe.DataFrame without using pandas on spark API?
我对 Pyspark 完全陌生,因为 Pyspark 没有 loc 功能,我们如何编写这个逻辑。 我尝试通过指定条件但无法获得理想的结果,任何帮助将不胜感激!
df['Total'] = (df['level1']+df['level2']+df['level3']+df['level4'])/df['Number']
df.loc[df['level4'] > 0, 'Total'] += 4
df.loc[((df['level3'] > 0) & (df['Total'] < 1)), 'Total'] += 3
df.loc[((df['level2'] > 0) & (df['Total'] < 1)), 'Total'] += 2
df.loc[((df['level1'] > 0) & (df['Total'] < 1)), 'Total'] += 1
对于如下数据
data_ls = [
(1, 1, 1, 1, 10),
(5, 5, 5, 5, 10)
]
data_sdf = spark.sparkContext.parallelize(data_ls). \
toDF(['level1', 'level2', 'level3', 'level4', 'number'])
# +------+------+------+------+------+
# |level1|level2|level3|level4|number|
# +------+------+------+------+------+
# | 1| 1| 1| 1| 10|
# | 5| 5| 5| 5| 10|
# +------+------+------+------+------+
您实际上是在更新每个语句中的total
列,而不是以 if-then-else 的方式。 可以使用多个withColumn()
和when()
) 在 pyspark 中复制您的代码(按原样),如下所示。
data_sdf. \
withColumn('total', (func.col('level1') + func.col('level2') + func.col('level3') + func.col('level4')) / func.col('number')). \
withColumn('total', func.when(func.col('level4') > 0, func.col('total') + 4).otherwise(func.col('total'))). \
withColumn('total', func.when((func.col('level3') > 0) & (func.col('total') < 1), func.col('total') + 3).otherwise(func.col('total'))). \
withColumn('total', func.when((func.col('level2') > 0) & (func.col('total') < 1), func.col('total') + 2).otherwise(func.col('total'))). \
withColumn('total', func.when((func.col('level1') > 0) & (func.col('total') < 1), func.col('total') + 1).otherwise(func.col('total'))). \
show()
# +------+------+------+------+------+-----+
# |level1|level2|level3|level4|number|total|
# +------+------+------+------+------+-----+
# | 1| 1| 1| 1| 10| 4.4|
# | 5| 5| 5| 5| 10| 6.0|
# +------+------+------+------+------+-----+
我们可以将所有withColumn()
和when()
合并到一个带有多个when()
语句的withColumn()
中。
data_sdf. \
withColumn('total', (func.col('level1') + func.col('level2') + func.col('level3') + func.col('level4')) / func.col('number')). \
withColumn('total',
func.when(func.col('level4') > 0, func.col('total') + 4).
when((func.col('level3') > 0) & (func.col('total') < 1), func.col('total') + 3).
when((func.col('level2') > 0) & (func.col('total') < 1), func.col('total') + 2).
when((func.col('level1') > 0) & (func.col('total') < 1), func.col('total') + 1).
otherwise(func.col('total'))
). \
show()
# +------+------+------+------+------+-----+
# |level1|level2|level3|level4|number|total|
# +------+------+------+------+------+-----+
# | 1| 1| 1| 1| 10| 4.4|
# | 5| 5| 5| 5| 10| 6.0|
# +------+------+------+------+------+-----+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.