2017-06-20 60 views
0

我有一个包含几个记录的数据帧,获取数据框的行字段的值 - 星火斯卡拉

enter image description here

Image in order to show that the DF contains data

我想重复这个数据帧中的每一行,以验证其每列的数据,做如下代码:

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的值(以确保我发送corret信息到每个功能),它并没有给我带来什么:

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

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

如果您的验证功能很简单(比如检查空值),那么你可以通过使用合适的spark dataframe functions嵌入功能

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

你可以做同样的方式等栏目相同

如果您的验证规则很复杂,那么你可以使用udf功能

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

您可以调用使用withColumn作为

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

您可以为您的验证规则,其余这样做udf功能。

我希望看到您的问题很快就会解决

+0

并且您提到的方法如何保存不满足使用的UDF的行?对不起这个虚拟问题。我用这些Spark和Scala东西播种新手 –

+0

你可以在'udf'函数中定义'if else'声明。如果规则为“if”而不符合规则则为“else”。 –

1

map是一个转型,你需要申请一个action,例如你可以做dfNextRows.map(x => ValidaLinea(x)).first。 Spark很懒惰地操作,很像标准集合上的Stream类。