2016-09-03 9 views
0

でグループと(ケース)の文私は4つの列(ID int型、名前文字列、携帯の文字列、電話の文字列)SPARKのDATAFRAME:ハイブmaxの代替Scalaのコード

とのデータフレームを持って、私はロジックを実装するための別の方法が必要ですスカラーコードへのハイブクエリで。

ハイブのクエリは次のとおりです。

SELECT id AS member_id 
,max(CASE WHEN name = 'Mrs.' THEN mobile ELSE NULL END) AS mobile 
,max(CASE WHEN name = 'Dr.' THEN phone ELSE NULL END) AS phone 
from temp1 
group by id; 

感謝。

答えて

1

あなたが書くことができます。

dataFrame.registerTempTable("temp1") 
val result = sqlContext.sql (here put same SQL as in question) 

それとも

がスパーク2.0で、それは次のようになります。

val mobileUDF = udf { 
    (name : String, mobile : String) => if (name == "Mrs.") mobile else null; 
} 
val phoneUDF = udf { 
    (name : String, phone: String) => if (name == "Mrs.") phone else null; 
} 

dataset.withColumn("newMobile", mobileUDF($"name", $"mobile")) 
    .withColumn("newPhone", phoneUDF($"name", $"phone")) 
    .groupBy($"id") 
    .agg(max(col("newMobile")), max(col("newPhone"))) 
0

試してみてください:

dataset.createTempView("temp1") 
val result = sparkSession.sql(here put same SQL as in question) 

を代わりに、データセットのAPIを使用することができます

df.groupBy('id).agg(
    max(when('name === "Mrs.", 'mobile)).alias("mobile"), 
    max(when('name === "Dr.", 'phone)).alias("phone") 
) 
関連する問題