在火花中比较两个数据框中的列
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)来执行这些查询并在结果中捕获原语。
【讨论】:
以上是关于在火花中比较两个数据框中的列的主要内容,如果未能解决你的问题,请参考以下文章