Apache spark 在pyspark数据帧中使用循环动态生成多列
我需要在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
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)
,但这只是隐藏了循环。在引擎盖下,它应该是相同的执行计划。