2017-06-20 71 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類。