获取DataFrame行的字段值 - Spark Scala

时间:2017-06-20 22:44:47

标签: scala apache-spark

我有一个包含多条记录的DataFrame,

enter image description here

Image in order to show that the DF contains data

我想迭代这个DataFrame的每一行,以便验证每个列的数据,执行类似下面的代码:

val validDF = dfNextRows.map {
    x => ValidateRow(x)
}

def ValidateRow(row: Row) : Boolean =  {
    val nC = row.getString(0)
    val si = row.getString(1)
    val iD = row.getString(2)
    val iH = row.getString(3)
    val sF = row.getString(4)

    // Stuff to validate the data field of each row
    validateNC(nC)
    validateSI(SI)
    validateID(ID)
    validateIF(IF)
    validateSF(SF)
    true
}

但是,做一些测试,如果我想要打印val nC 的值(为了确保我将相关信息发送到每个函数),它不会&#39带给我任何东西:

def ValidateRow(row: Row) : Boolean =  {
    val nC = row.getString(0)
    val si = row.getString(1)
    val iD = row.getString(2)
    val iH = row.getString(3)
    val sF = row.getString(4)

    println(nC)

    validateNC(nC)
    validateSI(SI)
    validateID(ID)
    validateIF(IF)
    validateSF(SF)
    true
}

enter image description here

我怎么知道我向每个功能发送了正确的信息(我正确地读取了每行的数据)?

问候。

2 个答案:

答案 0 :(得分:3)

Spark dataframe function应该给你一个良好的开端。

如果验证函数足够简单(比如检查空值),那么可以将函数嵌入为

dfNextRows.withColumn("num_cta", when(col("num_cta").isNotNull, col("num_cta").otherwise(lit(0)) ))

只需使用适当的spark dataframe functions

,您就可以以相同的方式对其他列执行相同的操作

如果您的验证规则很复杂,那么您可以使用udf函数

def validateNC = udf((num_cta : Long)=> {
   //define your rules here
})

您可以使用udf作为

来调用withColumn函数
dfNextRows.withColumn("num_cta", validateNC(col("num_cta")))

您可以为剩余的验证规则执行此操作。

我希望很快就能解决您的问题

答案 1 :(得分:2)

map是转化,您需要应用action,例如您可以dfNextRows.map(x => ValidaLinea(x)).first。 Spark懒得运行,就像标准集合上的Stream类一样。