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

Posted

技术标签:

【中文标题】pyspark 数据框如果不存在则添加一列【英文标题】:pyspark dataframe add a column if it doesn't exist 【发布时间】:2017-03-01 08:16:43 【问题描述】:

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

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

我想在给定的 json 文件中不存在但可能存在于其他文件中的列 'b'、'c'、'd' 和 'f' 上聚合数据。所以因为列 '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":""

有人可以帮忙吗?提前致谢!

【问题讨论】:

【参考方案1】:

您可以检查数据框中的列是否可用,并仅在必要时修改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

【讨论】:

谢谢,就是这么简单。我想我需要再次阅读文档。 @Mariusz 我有两个数据框。我比较了他们的架构,一个数据框缺少 3 列。我有这个作为清单。现在我想将这些列添加到缺少这些列的数据框中。具有空值。我们怎样才能一次性做到这一点。 @Virureddy 为每个缺失的列执行 df = df.withColumn(col_name, lit(None).cast(col_datatype)) @Mariusz 我们可以自动执行此操作吗?我收到无法解析列异常。而且我不想硬编码列名,因为每个作业有 50 列。 当然,但是您需要在某处拥有一个有效的列列表(因为代码需要知道您的参考架构是什么)。然后只需添加一个 for 循环:for column in columns_list: if column not in df.columns: ...【参考方案2】:

如果有人在 Scala 中需要这个:

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

【讨论】:

【参考方案3】:

这个函数是我的结果。

    def detect_data(column, df, data_type):
          if not column in df.columns:
            ret = lit(None).cast(data_type)
          else:
            ret = col(column).cast(data_type)
            
          return ret

    df = df.withColumn('f', detect_data('f', df, StringType()))

【讨论】:

以上是关于pyspark 数据框如果不存在则添加一列的主要内容,如果未能解决你的问题,请参考以下文章

使用圆形函数转换 pyspark 数据框列不起作用(pyspark)

如果不存在则添加列

Pyspark:检查数据框中是不是存在列[重复]

如何使用 pyspark 2.1.0 选择另一个数据框中不存在的行?

如果 pyspark 中不存在,则从数据中选择键列为 null

为啥在 pyspark 中加入两个临时视图后删除列不起作用,但它适用于数据框连接?