簡體   English   中英

獲取DataFrame行的字段的值-Spark Scala

[英]Getting values of Fields of a Row of DataFrame - Spark Scala

我有一個包含多個記錄的DataFrame,

在此處輸入圖片說明

圖片以顯示DF包含數據

我想迭代此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的值(以確保將正確的信息發送到每個函數),它不會給我帶來任何好處:

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
}

在此處輸入圖片說明

我怎么知道我正在向每個函數發送正確的信息(我正在正確讀取行的每一列的數據)?

問候。

Spark數據框功能應為您提供一個良好的開端。

如果您的驗證函數足夠簡單(例如檢查空值),則可以將函數嵌入為

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

您可以通過使用適當的spark數據框函數以相同的方式對其他列執行相同的操作

如果您的驗證規則很復雜,則可以將udf函數用作

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

您可以調用udf使用功能withColumn作為

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

您可以對其余的驗證規則執行此操作。

希望您的問題早日得到解決

map是一個轉換,您需要應用一個動作 ,例如可以執行dfNextRows.map(x => ValidaLinea(x)).first Spark運行緩慢,很像標准集合中的Stream類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM