首页 > 解决方案 > 如何仅将一些字段插入配置单元表,重用现有的表模式?

问题描述

我已经有一个配置单元表,它是在测试之前创建的,例如它有列 A(字符串类型)、B(字符串)、C(数字)。

在测试用例中,我只想插入测试数据,稍后将对其进行查询,例如在 A、B 列中。

将仅包含 A 列和 B 列数据的测试数据插入包含差异模式的现有表中的最佳方法是什么?

在尝试执行类似的操作时,我通常会遇到类似架构不匹配错误、列计数不匹配等错误

val df = session.createDataFrame(rows, schema)
df.write.mode(SaveMode.Append).format("orc").saveAsTable(mytableName)

其中schema是现有的表模式session.table(mytableName).schema,并且rows是具有列 A 和 B 的值的元组列表。

有没有合适的 API 来做到这一点?

如何仅将一些字段插入配置单元表,重用现有的表模式?

标签: scalaapache-sparkhiveapache-spark-sql

解决方案


将新列附加到要写入表的数据框。前任 -

假设您有两行数据 - 由两个元组表示:

val rows = Seq(("1", "2"), ("3", "4"))
val df = sc.parallelize(rows).toDF("A", "B")
val newDf = df.withColumn("C", lit(null).cast(IntegerType))
// Now newDf schema will be same as your table schema
println(newDf.schema)
println(session.table(mytableName).schema) 
df.write.mode(SaveMode.Append).format("orc").saveAsTable(mytableName)

推荐阅读