【问题标题】:How to traverse column of dataset in spark?如何在火花中遍历数据集列?
【发布时间】:2018-01-12 09:49:40
【问题描述】:

我想在 scala 中更改 spark 数据集的所有列模式; sudo代码是这样的:

   val mydataset  =...
    for (col_t <- mydataset.columns) {
        if (col_t.name.startsWith("AA")) col_t.nullable=true; 
        if (col_t.name.startsWith("BB")) col_t.name+="CC"; 
    }

它应该根据条件更新每个(或全部)的列名和可为空的属性。

【问题讨论】:

    标签: scala apache-spark spark-dataframe apache-spark-dataset


    【解决方案1】:

    您可以使用df.schema 获取数据框的当前架构,对其进行映射,应用您的条件并将其应用回原始数据框之上。

    import org.apache.spark.sql.types._
    
    val newSchema = df.schema.map{ case StructField(name, datatype, nullable, metadata) =>
        if (name.startsWith("AA") ) StructField(name, datatype, true, metadata)
        if (name.startsWith("BB") ) StructField(name+"CC" , datatype, true, metadata)
        // more conditions here
    }
    

    这将返回一个List[StructField]

    要将其应用于您的原始数据框(df):

    val newDf = spark.createDataFrame(df.rdd, StructType(newSchema) )
    

    【讨论】:

    • 简洁的解决方案。我想单独的if () =&gt; ... 子句是单个嵌套的if/else 子句减去=&gt;s?
    • 感谢您的观察。是的,它们是常见的 if-else 结构。我马上修改。
    【解决方案2】:

    你必须使用 df.schema 来实现这一点。

    伪代码如下。

    import org.apache.spark.sql.types.{ StructField, StructType }
    import org.apache.spark.sql.{ DataFrame, SQLContext }
    
    val newSchema = StructType(df.schema.map {
          case StructField(c, t, _, m) if c.equals(cn) && cn.startsWith("AA") => StructField(c, t, nullable = true, m)
          case StructField(c, t, _, m) if c.equals(cn) && cn.startsWith("BB") => StructField(c + "CC", t, nullable = nullable, m)
          case y: StructField => y
        })
    val newDf = df.sqlContext.createDataFrame(df.rdd, newSchema)
    

    希望,这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-13
      • 2010-10-22
      • 2020-09-17
      • 2019-04-29
      • 2019-12-20
      • 2020-07-25
      相关资源
      最近更新 更多