【问题标题】:pyspark dataframe add a column if it doesn't existpyspark 数据框如果不存在则添加一列
【发布时间】: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":""}

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

【问题讨论】:

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


    【解决方案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()))
      

      【讨论】:

        猜你喜欢
        • 2020-11-03
        • 1970-01-01
        • 2018-02-02
        • 2019-03-12
        • 1970-01-01
        • 2021-12-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多