获取具有不同列的最大值的特定列的不同值

时间:2017-03-02 09:05:06

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

我有以下DataFrame

+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
|   A|   6|null|null|
|   B|null|   5|null|
|   C|null|null|   7|
|   B|null|null|   4|
|   B|null|   2|null|
|   B|null|   1|null|
|   A|   4|null|null|
+----+----+----+----+

我想在Spark中做的是返回col1中的所有条目,如果它具有col2col3或{{1}列之一的最大值}}

这段代码不能做我想要的事情:

col4

这个只给出了一列(1)的最大值:

df.groupBy("col1").max("col2","col3","col4").show()

我甚至尝试合并单个输出:

df.groupBy("col1").max("col2").show()

其中//merge rows val rows = test1.rdd.zip(test2.rdd).map{ case (rowLeft, rowRight) => Row.fromSeq(rowLeft.toSeq ++ rowRight.toSeq)} //merge schemas val schema = StructType(test1.schema.fields ++ test2.schema.fields) // create new df val test3: DataFrame = sqlContext.createDataFrame(rows, schema) test1 test2已完成查询(1)。

那我怎么能很好地实现这个呢?

DataFrames

甚至只有不同的值:

+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
|   A|   6|null|null|
|   B|null|   5|null|
|   C|null|null|   7|
+----+----+----+----+

提前致谢!最好

2 个答案:

答案 0 :(得分:2)

您可以使用以下内容: -

sqlcontext.sql("select x.* from table_name x ,
(select max(col2) as a,max(col3) as b, max(col4) as c from table_name ) temp 
where a=x.col2 or b= x.col3 or c=x.col4")

会给出理想的结果。

答案 1 :(得分:1)

可以这样解决:

df.registerTempTable("temp")

spark.sql("SELECT max(col2) AS max2, max(col3) AS max3, max(col4) AS max4 FROM temp").registerTempTable("max_temp")

spark.sql("SELECT col1 FROM temp, max_temp WHERE col2 = max2 OR col3 = max3 OR col4 = max4").show