如何将一个数据帧的模式应用于另一个?

时间:2017-07-03 03:30:02

标签: scala apache-spark apache-spark-sql

我有一个场景,我将文件读取为String,我需要将其与表进行比较以进行一些操作。

myDict[key]?.append(val) ?? (myDict[key] = [val])

因此df1来自file,它将两列都作为String,而df2的架构为Int和String。这只是一个示例,我有许多列可供选择,并且无法提及每个列名称。有没有办法实现df2到df1的列模式?或者是否可以从表中选择*作为字符串? 例如,

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

1 个答案:

答案 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表创建数据集。

  

table(tableName:String):DataFrame 将指定的表作为DataFrame返回。

您的代码将如下(我认为这将更容易理解):

val df2 = spark.table("table")