在火花中比较两个数据框中的列

Posted

技术标签:

【中文标题】在火花中比较两个数据框中的列【英文标题】:Comparing columns in two data frame in spark 【发布时间】:2017-10-04 13:55:03 【问题描述】:

我有两个数据框,它们都包含不同数量的列。 我需要比较它们之间的三个字段以检查它们是否相等。

我尝试了以下方法,但它不起作用。

if(df_table_stats("rec_cnt").equals(df_aud("REC_CNT")) || df_table_stats("hashcount").equals(df_aud("HASH_CNT")) || round(df_table_stats("hashsum"),0).equals(round(df_aud("HASH_TTL"),0)))
    
        println("Job executed succefully")
    

df_table_stats("rec_cnt"),这将返回 Column 而不是实际值,因此条件变为 false。

另外,请解释df_table_stats.select("rec_cnt")df_table_stats("rec_cnt")之间的区别。

谢谢。

【问题讨论】:

首先回答您的第二个问题,df_table_stats("rec_cnt")Column 参考。在执行连接或数据帧投影时,您通常会使用这样的参考。 df_table_stats.select("rec_cnt") 返回一列 (rec_cnt) 的 DataFrame。您需要更具体地说明“比较它们之间的三个字段”的含义。 DataFrames 是数据的集合。具体来说,您需要比较什么? 我想从数据报中检查这三个字段。如果它们相等,则打印“作业成功运行”的消息。 你能说得更具体点吗?一个数据框有几行,每行有一列或多列。使用该术语,您具体要检查什么?第一行是否具有特定字段的特定值? 两个数据框只有单行。我想比较它们之间的列(3 个命名列)。 【参考方案1】:

根据您的条件使用 sql 和内部联接 df 。

【讨论】:

【参考方案2】:

根据我的评论,您使用的语法是简单的列引用,它们实际上并不返回数据。假设您必须为此使用 Spark,您需要一个实际返回数据的方法,在 Spark 中称为 action。对于这种情况,您可以使用 take 返回数据的第一个 Row 并提取所需的列:

val tableStatsRow: Row = df_table_stats.take(1).head
val audRow: Row = df_aud.take(1).head

val tableStatsRecCount = tableStatsRow.getAs[Int]("rec_cnt")
val audRecCount = audRow.getAs[Int]("REC_CNT")

//repeat for the other values you need to capture

但是,如果您只使用 Spark,肯定 就太过分了。您可以使用简单的 Scala JDBC 库(例如 ScalikeJDBC)来执行这些查询并在结果中捕获原语。

【讨论】:

以上是关于在火花中比较两个数据框中的列的主要内容,如果未能解决你的问题,请参考以下文章

折叠火花数据框中的列值

将行值转换为火花数据框中的列数组

使用 scala 使用布尔运算折叠火花数据框中的列

在火花数据框中使用 for 循环添加新列

如何根据列在火花中重新分区?

如何在火花中合并或连接具有不相等列号的数据框