我如何将合并Pyspark与Column结合在一起?

djmepvbi  于 2024-01-06  发布在  Spark
关注(0)|答案(1)|浏览(156)

我有一个带有编号列(1到12)的嵌套框架,我需要结合with列和for循环的逻辑。给出这个示例嵌套框架:

  1. df = spark.createDataFrame(
  2. [(100, 100, 'A', 'A'),
  3. (1000, 200, 'A', 'A'),
  4. (1000, 300, 'B', 'A'),
  5. (1000, 1000, 'B', 'B')],
  6. "days1 int, days2 int, code1 string, code2 string")
  7. df.show()
  8. +-----+-----+-----+-----+
  9. |days1|days2|code1|code2|
  10. +-----+-----+-----+-----+
  11. | 100| 100| A| A|
  12. | 1000| 200| A| A|
  13. | 1000| 300| B| A|
  14. | 1000| 1000| B| B|
  15. +-----+-----+-----+-----+

字符串
我需要像这样创建一个新列:如果days(n)> 100,则new(n)= code(n),否则'X'

  1. df.withColumn('new1', F.when(F.col('days1') > 100, F.col('code1')).otherwise('X')).show()
  2. +-----+-----+-----+-----+----+
  3. |days1|days2|code1|code2|new1|
  4. +-----+-----+-----+-----+----+
  5. | 100| 100| A| A| X|
  6. | 1000| 200| A| A| A|
  7. | 1000| 300| B| A| B|
  8. | 1000| 1000| B| B| B|
  9. +-----+-----+-----+-----+----+


我知道有一个带有select的for循环,如下所示:

  1. df.select(*[F.col(f'days{i+1}') for i in range(2)], *[F.col(f'code{i+1}') for i in range(2)]).show()
  2. +-----+-----+-----+-----+
  3. |days1|days2|code1|code2|
  4. +-----+-----+-----+-----+
  5. | 100| 100| A| A|
  6. | 1000| 200| A| A|
  7. | 1000| 300| B| A|
  8. | 1000| 1000| B| B|
  9. +-----+-----+-----+-----+


我试过这样做,但得到一个错误。这可能吗?

  1. df.withColumn(*[(f'new{i+1}', F.when(F.col(f'days{i+1}') > 100, F.col(f'code{i+1}')).otherwise('X'))
  2. for i in range(2)])\
  3. .select('days1', 'code1', 'new1')\
  4. .show()
  5. TypeError: col should be Column

txu3uszq

txu3uszq1#

select函数接受一个列数组,但是withColumn有两个参数columnName和value。如果你想动态添加列,可以这样做:

  1. for i in range(2):
  2. df = df.withColumn(f'new{i+1}', F.when(F.col(f'days{i+1}') > 100, F.col(f'code{i+1}')).otherwise('X'))

字符串

相关问题