我有以下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
中的所有条目,如果它具有col2
,col3
或col4
的最大值。
这个片段不会做我想要的:
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)
其中 test1
和 test2
是用查询(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