scala - 如何仅将一些字段插入配置单元表,重用现有的表模式?
问题描述
我已经有一个配置单元表,它是在测试之前创建的,例如它有列 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 来做到这一点?
如何仅将一些字段插入配置单元表,重用现有的表模式?
解决方案
将新列附加到要写入表的数据框。前任 -
假设您有两行数据 - 由两个元组表示:
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)
推荐阅读
- oracle - Oracle - 无法调用以模式名称为前缀的函数
- c# - C# XDocument 转义符号的正确方法
- azure - 在本地运行 Azure Functions 时使用存根
- javascript - 一个 url 下的多个 html
- android - 在 Android 中将 RadioGroup 中的 3 个 RadioButton 水平对齐为左、中、右
- c++ - 在 C++ 中使用类型定义显式声明枚举:有必要吗?
- vue.js - 将组件中的 Vue 表单输入验证移动到方法中
- javascript - 当在 Angular 上首次加载时触发时,放置在 HTML 中的模态不会弹出。但是如果浏览器刷新它就可以了
- git - git忽略本地和服务器上的文件
- javascript - ReactJS:TypeError:无法读取未定义的属性“包含”