如何在火花中遍历数据集列?

Posted

技术标签:

【中文标题】如何在火花中遍历数据集列?【英文标题】: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"; 
    

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

【问题讨论】:

【参考方案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)

希望,这会有所帮助。

【讨论】:

以上是关于如何在火花中遍历数据集列?的主要内容,如果未能解决你的问题,请参考以下文章

C#,遍历数据集并显示数据集列中的每条记录

遍历火花数据框中的列并计算最小值最大值

如何通过 Python 中的 Plotly 从 Dash 的下拉列表中选择数据集列?

如何将 birt 数据集列拆分为多行

如何在火花中合并两个不同的数据帧? [复制]

如何在火花流中刷新加载的数据帧内容?