pyspark数据框如果不存在则添加一列

时间:2017-03-01 08:16:44

标签: apache-spark pyspark apache-spark-sql pyspark-sql

我在各种json文件中有json数据并且键的行可能不同,例如

{"a":1 , "b":"abc", "c":"abc2", "d":"abc3"}
{"a":1 , "b":"abc2", "d":"abc"}
{"a":1 ,"b":"abc", "c":"abc2", "d":"abc3"}

我希望在列' b' c',' d'和' f'它不存在于给定的json文件中,但可能存在于其他文件中。作为专栏' f'不存在我们可以为该列取空字符串。

我正在阅读输入文件并聚合像这样的数据

import pyspark.sql.functions as f
df =  spark.read.json(inputfile)
df2 =df.groupby("b","c","d","f").agg(f.sum(df["a"]))

这是我想要的最终输出

{"a":2 , "b":"abc", "c":"abc2", "d":"abc3","f":"" }
{"a":1 , "b":"abc2", "c":"" ,"d":"abc","f":""}

任何人都可以帮忙吗?提前谢谢!

2 个答案:

答案 0 :(得分:11)

您可以检查数据框中的列是否可用,并仅在必要时修改df

if not 'f' in df.columns:
   df = df.withColumn('f', f.lit(''))

对于嵌套架构,您可能需要使用df.schema,如下所示:

>>> df.printSchema()
root
 |-- a: struct (nullable = true)
 |    |-- b: long (nullable = true)

>>> 'b' in df.schema['a'].dataType.names
True
>>> 'x' in df.schema['a'].dataType.names
False

答案 1 :(得分:2)

如果有人需要在Scala中使用它,

if (!df.columns.contains("f")) {
  val newDf = df.withColumn("f", lit(""))
}