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



我有以下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中的所有条目,如果它具有col2col3col4的最大值。

这个片段不会做我想要的:

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

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

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)

其中 test1test2是用查询(1)。

完成的 DataFrames

那么我该如何实现?

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

,甚至只有不同的值:

+----+
|col1|
+----+
|   A|
|   B|
|   C|
+----+

预先感谢!最好的

您可以使用以下类似的东西: -

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")

将给出所需的结果。

可以这样解决:

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

相关内容

  • 没有找到相关文章

最新更新