2016-05-27 5 views
2

私はJSONオブジェクトから作成されたデータフレームを持っています。私はこのデータフレームを照会して寄木張りに書き込むことができます。データフレームのスキーマを使用したスパークマップデータフレーム

私はスキーマを推論しているので、私は必ずしもデータフレームの内容を知る必要はありません。

独自のスキーマを使用して、データフレームを列名またはマッピングする方法はありますか?

// The results of SQL queries are DataFrames and support all the normal RDD operations. 
// The columns of a row in the result can be accessed by field index: 
df.map(t => "Name: " + t(0)).collect().foreach(println) 

// or by field name: 
df.map(t => "Name: " + t.getAs[String]("name")).collect().foreach(println) 

// row.getValuesMap[T] retrieves multiple columns at once into a Map[String, T] 
df.map(_.getValuesMap[Any](List("name", "age"))).collect().foreach(println) 
// Map("name" -> "Justin", "age" -> 19) 

私は、実際の量または列の名前を知らなくても

df.map (_.getValuesMap[Any](ListAll())).collect().foreach(println) 
// Map ("name" -> "Justin", "age" -> 19, "color" -> "red") 

ような何かをしたいと思います。

+0

ya ..これはかなり驚くべきことです。私たちはケースクラスを提供するか、既存のDataFrameスキーマを使用する必要があります。私は同じ情報を探し回っています。 – javadba

+0

'df.printSchema'のカラム名と推論(SQL)データ型が必要な場合 – Davos

+0

sdoutへの印刷にはそれを必要としませんでした。後で処理するために必要でした。 – Havnar

答えて

4

さて、あなたはできますが、結果は、むしろ無用です:

val df = Seq(("Justin", 19, "red")).toDF("name", "age", "color") 

def getValues(row: Row, names: Seq[String]) = names.map(
    name => name -> row.getAs[Any](name) 
).toMap 

val names = df.columns 
df.rdd.map(getValues(_, names)).first 

// scala.collection.immutable.Map[String,Any] = 
// Map(name -> Justin, age -> 19, color -> red) 

実際に有用な1は、SQL型とスカラ型の間の適切なマッピングと何かを得るために。単純なケースでは難しくありませんが、一般的に難しいです。たとえば、任意のstructを表すために使用できる組み込み型があります。これは少しのメタプログラミングを使用して行うことができますが、おそらくそれはすべての大騒ぎの価値があるわけではありません。

+0

*これはデータフレームが私たちに与えることができる最高のものです*。 – javadba

+0

私はこれを得ます: "原因:java.lang.NoSuchFieldException:MODULE $" :( – Gevorg

関連する問題