i具有以下数据框(称为df
),带有item_name
和item_level
:
item_name item_level
----------------------------
Item1 1
Item2 2
Item3 2
Item4 3
我想创建一个新列,该列会根据其水平产生项目的缩进。为此,我想将item_level乘以字符串'---',并想到当我这样做时,字符串与整数的值一样多次与整数的值相连。
我所需的结果是这样的:
item_name item_level new_column
------------------------------------------------
Item1 1 ---Item1
Item2 2 ------Item2
Item3 2 ------Item3
Item4 3 ---------Item4
在我编写以下命令时,在Pyspark中,创建列仅包含null
值:
from pyspark.sql import functions as F
df = df.withColumn('new_column',F.concat(F.lit(df.item_level*'---'),df.item_name))
null
值似乎来自用字符串的整数的乘法。concat
功能似乎正常工作。例如,以下工作:
df = df.withColumn('new_column',F.concat(df.item_name,df.item_name))
我还尝试了其他几件事。如果我使用恒定数来乘以字符串,则如图所希望的那样显示结果字符串:
number = 3
df = df.withColumn('new_column', F.lit(number*'---'))
此外,首先在列中添加'---'字符串(带相同的行'---'),然后将该列与item_level列相乘,也给出空值:
df = df.withColumn('padding',F.lit('---'))
df = df.withColumn('test',df.padding*df.item_name)
如果我使用熊猫,那么最后一件代码可以做我想要的。但是我需要在pyspark中做到这一点。
有一个函数 pyspark.sql.functions.repeat
:
重复一个字符串列n次,并将其返回为新的字符串列。
与您在代码中所做的那样,repeat
与item_name
的结果相连。唯一的皱纹是您需要使用pyspark.sql.functions.expr
才能将列值作为参数传递给Spark函数。
from pyspark.sql.functions import concat, expr
df.withColumn(
"new_column",
concat(expr("repeat('---', item_level)"), "item_name")
).show()
#+---------+----------+--------------+
#|item_name|item_level| new_column|
#+---------+----------+--------------+
#| Item1| 1| ---Item1|
#| Item2| 2| ------Item2|
#| Item3| 2| ------Item3|
#| Item4| 3|---------Item4|
#+---------+----------+--------------+
请注意,show()
将正确证明显示的输出是合理的,但是基础数据是根据您所需的。