比较spark中两个数据框中的列

时间:2017-10-04 13:55:03

标签: scala hadoop apache-spark apache-spark-sql spark-dataframe

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

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

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")之间的区别。

感谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-1)

根据我的评论,您使用的语法是简单的列引用,它们实际上并不返回数据。假设你必须为此使用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)来执行这些查询并捕获结果中的基元。