我有一个场景,我将文件读取为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")
答案 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")