2017-07-03 11 views
1

私はファイルをStringとして読み込み、いくつかの操作を行うためにテーブルと比較する必要があるシナリオを持っています。1つのデータフレームのスキーマを別のデータフレームに適用する方法は?

df1 = sparkContext.parallelize(Seq(1,"aa")).toDF("Col1","Col2") // file 
df2 = spark.sql("select * from table") 

したがって、df1は両方の列が文字列であるのに対し、df2はIntおよびStringのようなスキーマを持ちます。これは単なるサンプルです。私は選択する列がたくさんあり、各列の名前については言及していません。 df2の列スキーマをdf1に実装する方法はありますか?または、表からStringを選択することは可能ですか?例のように 、

spark.sql("select cast(* as String) from table") 
+0

ファイルから読み込んでいる場合は、databricksパッケージを使用します。パッケージは自動的にスキーマを推論し、さらに独自のスキーマを提供できます。 –

+0

何を比較したいですか?いくつかのサンプルを与える。また、あなたが試したこととあなたの難しいことは何ですか? –

答えて

3

はあなたがやっているやっているが、ここではそれが来る、なぜそれが本当に明確ではないですが。

DF2はINTと文字列

としてスキーマを持っているのに対し、DF1するDF2の列スキーマを実装する方法はありますか?それ

spark.sql("select cast(* as String) from table")

あなたはString型であるdf2のすべての列をマッピングしたい表示されます。比較を動的に行う必要がある列の数は実際には分かりません。

val df2 = spark.sql("select * from table") 
scala> df2.printSchema 
root 
|-- id: long (nullable = false) 

// do the casting regardless of the number of columns 
val cols = df2.columns.map(c => col(c) cast "string") 
val solution = df2.select(cols: _*) // <-- a trick to use the columns 
scala> solution.printSchema 
root 
|-- id: string (nullable = false) 

tableテーブルからデータセットを作成するために、表演算子を使用することを検討してください。

テーブル(tableNameの:文字列):データフレームとして指定されたテーブルを返しデータフレーム。

次のようにあなたのコードは、(私が理解することがはるかに簡単だと思うもの)のようになります。

val df2 = spark.table("table") 
関連する問題