获取一行数据帧的字段值 - 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 nCtrong> 的值(以确保我将正确的信息发送到每个函数),它不会带给我任何东西:
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和Scala,通过映射公用键添加具有来自另一个数据帧的值的新列[重复]