2017-07-03 77 views
1

我有一個場景,我讀取一個文件作爲字符串,我需要比較它與表做一些操作。如何將一個數據框的模式應用於另一個數據框?

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

因此,df1是從兩個列作爲String的文件,而df2的架構是Int和String。這只是一個示例,我有很多列可供選擇,不能提及每個列名。有沒有辦法將df2的列模式實現爲df1?或者是否可以從表中選擇*作爲字符串? 示例一樣,

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

如果你是從文件中讀取,使用databricks包。該包會自動推斷架構,而且您可以提供自己的架構。 –

+0

你想和誰比較?給一些樣品。還要提到你已經嘗試了什麼,以及你最困難的部分是什麼? –

回答

3

儘管爲什麼你在幹什麼,你在做什麼,但在這裏談到的不是真的清楚

而DF2具有架構爲int和string

有沒有落實DF2的列架構DF1的方法嗎?

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

顯示出您希望的df2所有列映射爲String。鑑於你不知道有多少列需要動態比較。

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表中創建一個數據集。

表(表名:字符串):數據幀返回指定表作爲數據幀。然後

您的代碼將是如下(我覺得這是更容易理解):

val df2 = spark.table("table") 
相關問題