Pyspark将所有数据框值增加1

时间:2019-09-06 05:32:43

标签: python python-3.x pyspark apache-spark-sql

我正在尝试将数据框中的所有值增加1,除了ID列是一列。

示例:

enter image description here

结果:

enter image description here

到目前为止,这是我要做的,但是当我要处理许多列时(例如50个),它会变得有点长。

df_add = df.select(
  'Id',
  (df['col_a'] + 1).alias('col_a'),
  ..
  ..
)

是否有更多的Python方式可以达到相同的结果?

4 个答案:

答案 0 :(得分:4)

编辑(基于@Daniel注释): 您可以直接使用lit函数

from pyspark.sql.functions import col, lit

for column in plus_one_cols:
    df = df.withColumn(column, col(column) + lit(1))

上一个答案:

在列中添加“ 1”是一种列式操作,可能更适合pandas_udf

from pyspark.sql.functions import col, pandas_udf, PandasUDFType

@pandas_udf('double', PandasUDFType.SCALAR)
def plus_one(v):
    return v + 1

plus_one_cols = [x for x in df.columns if x != "Id"]

for column in plus_one_cols:
    df = df.withColumn(column, plus_one(col(column)))

这将比按行操作快得多。您也可以参考Introducing Pandas UDF for PySpark - Databricks

答案 1 :(得分:1)

如果列很多,则可以使用下面的单行格式,

from pyspark.sql.functions import lit,col

df.select('Id', *[(col(i) + lit(1)) for i in df.columns if i != 'Id']).toDF(*df.columns).show()

输出:

+---+-----+-----+-----+
| Id|col_a|col_b|col_c|
+---+-----+-----+-----+
|  1|    4|   21|    6|
|  5|    6|    1|    1|
|  6|   10|    2|    1|
+---+-----+-----+-----+

答案 2 :(得分:0)

您可以使用withColumn方法,然后按如下所示遍历各列:

df_add = df

for column in ["col_a", "col_b", "col_c"]:
    df_add = df_add.withColumn(column, expr(f"{column} +1").cast("integer"))

答案 3 :(得分:0)

使用php artisan clear:cache && php artisan clear:config && php artisan config:cache 向列添加值 例如:

pyspark.sql.functions.lit