2016-11-14 100 views
0

我有以下的数据帧,其中第三列是“clickedAirbnb”和第四列是“等级”根据spark数据框中另一列的值查找列的最大值?

| Tom|    Paris|    |     1| 
| Tom|   Mumbai|    |     1| 
| Tom|   Stockolm|    |     1| 
| Tom|    Oslo|  airbnb1|     2| 
| Tom|    Tokyo|  airbnb1|     2| 
| Tom|   Bangalore|  airbnb1|     2| 
| Sam|    Seoul|  airbnb11|     1| 
| Sam|    Tokyo|  airbnb11|     1| 
| Sam|   Berlin|  airbnb12|     2| 
| Sam|   Bangalore|  airbnb12|     2| 
| Sam|   Singapore|  airbnb12|     2| 
| Sam|    Oslo|  airbnb2|     3| 
| Sam|   Amsterdam|  airbnb2|     3| 
| Sam|   Bangalore|  airbnb2|     3| 

我想回到那些列“clickedAirbnb”包含空值和柱“最大等级”小于2 这里是我试过,但不起作用(无效操作对列抱怨)

val result1and2 = result.where(col("clickedAirbnb").contains("") 
          && max(col("rank")) <= 2) 

有没有一种方法来计算列上的最大价值?

UPDATE1: 要备份一下,结果DF计算这样

  val window = Window.partitionBy(df1("User")).orderBy(df1("clickedAirbnb")) 
      val result = df1.withColumn("clickedDestHotRank", dense_rank().over(window)) 

现在返回这些用户那里clickedAirbnb(第三列)是空的,排名(第4列)的最大值呢不超过2

val result2 = result.where(col("clickedAirbnb").contains("") 
           && (max(col("rank")) <=2)) 
+0

你的意思是其中'rank'小于2? – mtoto

+0

@moto - 请找到上述更新。 – user1384205

回答

-1

注册临时表,然后写所需的查询

your_data_frame.registerTempTable("table1"); 

res = sqlCtx.sql("select * where clickedAirbnb = "" and max(rank)<=2 from table1) ; 
0

看来你想:

  • 到组只有那些在没有价值clickedAirbnb
  • 回报群当且仅当它MAX(秩)< = 2

类似的东西,也许:

//those that have no value in clickedAirbnb 
val resultTmp = result.where(col("clickedAirbnb")==="") 

//is its max("rank")<=2 ? 
val b = resultTmp.select(max("rank")<=2).first().getBoolean(0) 

if(b){ 
    resultTmp.show() 
} 

希望我理解得很好。

0

我希望是这样的:

>>> from pyspark.sql.functions import * 
>>> sc = spark.sparkContext 
>>> rdd = sc.parallelize([ 
    ['Tom','Paris','',1], 
    ['Tom','Mumbai','',1], 
    ['Tom','Stockolm','',1], 
    ['Tom','Oslo','airbnb1',2], 
    ['Tom','Tokyo','airbnb1',2], 
    ['Tom','Bangalore','airbnb1',2], 
    ['Sam','Seoul','airbnb11',1], 
    ['Sam','Tokyo','airbnb11',1], 
    ['Sam','Berlin','airbnb12',2], 
    ['Sam','Bangalore','airbnb12',2], 
    ['Sam','Singapore','airbnb12',2], 
    ['Sam','Oslo','airbnb2',3], 
    ['Sam','Amsterdam','airbnb2',3], 
    ['Sam','Bangalore','airbnb2',3] 
]) 

>>> df = rdd.toDF(['name','city','clickedAirbnb', 'rank']) 
>>> df.show() 
+----+---------+-------------+----+ 
|name|  city|clickedAirbnb|rank| 
+----+---------+-------------+----+ 
| Tom| Paris|    | 1| 
| Tom| Mumbai|    | 1| 
| Tom| Stockolm|    | 1| 
| Tom|  Oslo|  airbnb1| 2| 
| Tom| Tokyo|  airbnb1| 2| 
| Tom|Bangalore|  airbnb1| 2| 
| Sam| Seoul|  airbnb11| 1| 
| Sam| Tokyo|  airbnb11| 1| 
| Sam| Berlin|  airbnb12| 2| 
| Sam|Bangalore|  airbnb12| 2| 
| Sam|Singapore|  airbnb12| 2| 
| Sam|  Oslo|  airbnb2| 3| 
| Sam|Amsterdam|  airbnb2| 3| 
| Sam|Bangalore|  airbnb2| 3| 
+----+---------+-------------+----+ 

>>> df.where(col("clickedAirbnb") == "").where(col("rank") <= 2).show() 
+----+--------+-------------+----+ 
|name| city|clickedAirbnb|rank| 
+----+--------+-------------+----+ 
| Tom| Paris|    | 1| 
| Tom| Mumbai|    | 1| 
| Tom|Stockolm|    | 1| 
+----+--------+-------------+----+ 
+0

如果正确,请标记为答案。 –

相关问题