Apache spark 在pyspark数据帧中使用循环动态生成多列

Apache spark 在pyspark数据帧中使用循环动态生成多列,apache-spark,pyspark,apache-spark-sql,pyspark-sql,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Sql,我需要在pyspark中动态生成多个列。我已经编写了如下类似的代码来实现同样的功能 sc = SparkContext() sqlContext = SQLContext(sc) cols = ['a','b','c'] df = sqlContext.read.option("header","true").option("delimiter", "|").csv("C

我需要在pyspark中动态生成多个列。我已经编写了如下类似的代码来实现同样的功能

sc = SparkContext()                                                          
sqlContext = SQLContext(sc)
cols = ['a','b','c']    

df = sqlContext.read.option("header","true").option("delimiter", "|").csv("C:\\Users\\elkxsnk\\Desktop\\sample.csv")

for i in cols:
    df1 = df.withColumn(i,lit('hi'))
df1.show()
但是,我在最终结果中遗漏了a列和b列。请帮忙

更改代码如下。它现在正在工作,但想知道是否有更好的处理方法

cols = ['a','b','c']
cols_add = []
flg_first = 'Y'
df = sqlContext.read.option("header","true").option("delimiter", "|").csv("C:\\Users\\elkxsnk\\Desktop\\sample.csv")
for i in cols:
    print('start'+str(df.columns))
    if flg_first == 'Y':
        df1 = df.withColumn(i,lit('hi'))
        cols_add.append(i)
        flg_first = 'N'
    else:enter code here
        df1 = df1.select(df.columns+cols_add).withColumn(i,lit('hi'))
        cols_add.append(i)
    print('end' + str(df1.columns))

df1.show()

在循环中,左侧是
df1
,而右侧是
df
。因此,每次迭代都会覆盖以前的结果。在循环之前执行
df1=df
,并将循环更改为:
df1=df1.withColumn(i,lit('hi'))
。当然。我已经意识到这一点。我更改了上面的代码(添加)以实现我想要的,但是我觉得应该有更好的方法。请检查并提出建议。使用
functools.reduce
的更简洁的表示法是:
df1=reduce(lambda d,i:d.withColumn(i,lit('hi')),cols,df)
,但这只是隐藏了循环。引擎盖下应该是相同的执行计划。在循环中,左侧是
df1
,而右侧是
df
。因此,每次迭代都会覆盖以前的结果。在循环之前执行
df1=df
,并将循环更改为:
df1=df1.withColumn(i,lit('hi'))
。当然。我已经意识到这一点。我更改了上面的代码(添加)以实现我想要的,但是我觉得应该有更好的方法。请检查并提出建议。使用
functools.reduce
的更简洁的表示法是:
df1=reduce(lambda d,i:d.withColumn(i,lit('hi')),cols,df)
,但这只是隐藏了循环。在引擎盖下,它应该是相同的执行计划。