2017-07-03 104 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") 
相关问题