如何在火花中遍历数据集列?
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 () => ...
子句是单个嵌套的if/else
子句减去=>
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)
希望,这会有所帮助。
【讨论】:
以上是关于如何在火花中遍历数据集列?的主要内容,如果未能解决你的问题,请参考以下文章