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 2.1.0 选择另一个数据框中不存在的行?