获取一行数据帧的字段值 - Spark Scala

Posted

技术标签:

【中文标题】获取一行数据帧的字段值 - Spark Scala【英文标题】:Getting values of Fields of a Row of DataFrame - Spark Scala 【发布时间】:2017-06-20 22:44:47 【问题描述】:

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

我想迭代此 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​​trong> 的值(以确保我将正确的信息发送到每个函数),它不会带给我任何东西:

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

我怎么知道我正在向每个函数发送正确的信息(我正在正确读取行的每一列的数据)?

问候。

【问题讨论】:

【参考方案1】:

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
)

您可以使用withColumn as 调用udf 函数

dfNextRows.withColumn("num_cta", validateNC(col("num_cta")))

您可以为其余的验证规则这样做。

希望您的问题尽快得到解决

【讨论】:

通过您提到的方法,我如何保存不满足使用的 UDF 的行?对不起这个愚蠢的问题。我用这些 Spark 和 Scala 的东西播种新手 您可以在udf函数中定义if else语句。 if 用于规则,else 用于不满足规则。【参考方案2】:

map 是一个转换,你需要应用一个action,例如你可以做dfNextRows.map(x => ValidaLinea(x)).first。 Spark 运行延迟,很像标准集合中的 Stream 类。

【讨论】:

您好 D 先生,我发现您在个人资料中提到您有兴趣与某人合作,但您没有留下电子邮件或其他联系方式。请问可以加一个吗?我认为有一个团队很适合你。谢谢! @Tomas Zubiri 我已经更新了我的个人资料以包含联系电子邮件。

以上是关于获取一行数据帧的字段值 - Spark Scala的主要内容,如果未能解决你的问题,请参考以下文章

在 Apache Spark (Scala) 上获取两个数据帧的差异

Spark 数据框无法比较 Null 值

Spark 中的数据框比较:Scala

Spark和Scala,通过映射公用键添加具有来自另一个数据帧的值的新列[重复]

无法使用 spark scala 从数据集中的行中获取第一列的值

Spark SCALA - 连接两个数据帧,其中一个数据帧中的连接值位于第二个数据帧中的两个字段之间