2016-04-15 11 views
3
Hive Table: (Name_Age: Map[String, Int] and ID: Int) 

+---------------------------------------------------------++------+ 
|     Name_Age        || ID | 
+---------------------------------------------------------++------+ 
|"SUBHAJIT SEN":28,"BINOY MONDAL":26,"SHANTANU DUTTA":35 || 15 | 
|"GOBINATHAN SP":35,"HARSH GUPTA":27,"RAHUL ANAND":26  || 16 | 
+---------------------------------------------------------++------+ 

私は複数行にName_Age列爆発しました:私は列データ型としてマップを持つテーブルを持っていますが、マップ用とキー用の2つの列を生成するためにどのように爆発させることができますか?

def toUpper(name: Seq[String]) = (name.map(a => a.toUpperCase)).toSeq 

sqlContext.udf.register("toUpper",toUpper _) 

var df = sqlContext.sql("SELECT toUpper(name) FROM namelist").toDF("Name_Age") 

df.explode(df("Name_Age")){case org.apache.spark.sql.Row(arr: Seq[String]) => arr.toSeq.map(v => Tuple1(v))}.drop(df("Name_Age")).withColumnRenamed("_1","Name_Age") 


+-------------------+ 
|  Name_Age  | 
+-------------------+ 
| [SUBHAJIT SEN,28]| 
| [BINOY MONDAL,26]| 
|[SHANTANU DUTTA,35]| 
| [GOBINATHAN SP,35]| 
| [HARSH GUPTA,27]| 
| [RAHUL ANAND,26]| 
+-------------------+ 

をしかし、私は爆発し、2行を作成したい:名前と年齢

+-------------------+-------+ 
|  Name  | Age | 
+-------------------+-------+ 
| SUBHAJIT SEN  | 28 | 
| BINOY MONDAL  | 26 | 
|SHANTANU DUTTA  | 35 | 
| GOBINATHAN SP  | 35 | 
| HARSH GUPTA  | 27 | 
| RAHUL ANAND  | 26 | 
+-------------------+-------+ 

いずれかを助けてもらえコード修正を爆発させる?

+0

を:

import org.apache.spark.sql.functions.explode val df = Seq((Map("foo" -> 1, "bar" -> 2), 1)).toDF("name_age", "id") val exploded = df.select($"id", explode($"name_age")).toDF("id", "name", "age") exploded.printSchema // root // |-- id: integer (nullable = false) // |-- name: string (nullable = false) // |-- age: integer (nullable = false) 

あなたはその後の組み込み関数を使用して大文字に変換することができますが問題を閉じるためにそれを受け入れてください! – eliasah

答えて

2

あなたがここに必要なのはtoUpperコールexplode機能ドロップすることです:、提供ソリューションは、あなたの質問に答える場合

import org.apache.spark.sql.functions.upper 

exploded.withColumn("name", upper($"name")) 
+0

私が探している解決策ではありません。 Map Key Valueのペアを解除し、2つの別々の列の値にする必要があります –

+0

@SubhajitSenそして、これはあなたがここで得られるものです。 – zero323

+0

ありがとうございました –

関連する問題