java - 使用 spark-avro 编写数据帧创建 topLevelRecord - 想要使用现有模式
问题描述
我正在使用 Kryo 编码器将 GenericRecords 编码为 spark DataFrame,并且正在将数据帧写入 Avro 文件。一旦我尝试从 Hive 读取文件,我收到一条错误消息,指出解析器找到了 toplevelrecord 而不是预期的字段。这条记录不在我现有的模式中,我认为它是在我使用 spark-avro 编写时创建的。我想知道是否/如何从 avro 文件中删除它。
这是它的样子:
{
"type":"record",
"name":"topLevelRecord",
"fields":[
{
"name":"value",
"type":["bytes","null"]
}
]
}
解决方案
Avro Schema中需要name 字段( https://jaceklaskowski.gitbooks.io/mastering-spark-sql/spark-sql-AvroOptions.html)
如果未在架构中设置值topLevelRecord是默认值,但是您可以在编写数据框时提供一个值来覆盖它。
Scala:创建一个参数映射并将其传递给编写器:
val name = "AvroTest"
val parameters = Map("recordName" -> name)
df.write.options(parameters).format("avro").save("/tmp/output")
参考:https ://docs.databricks.com/spark/latest/data-sources/read-avro.html
Python:将选项传递给编写器,如下所示:
df.write.format("com.databricks.spark.avro").option("recordName", "Uber").save("tmp/output")
推荐阅读
- android - 分页库使数据源无效
- nsis - 当我们使用 NSIS 运行安装程序时,如何在默认情况下在任务管理器中显示系统托盘图标以及相应的可执行文件?
- soapui - Soap UI - 对单个请求的多个响应
- python - 有效计算列表中每个多边形的中心
- r - 在 R 的数据表中查找行 ID 的问题
- sql-server - tableau 自定义 sql 数据透视表
- reactjs - 如何在 Jest 中找到子元素?
- swift - 如何将帖子 ID 传递给评论 VC - Swift
- javascript - 如何在javascript(node.js)中将ASCII 7段号解码为普通数字
- java - 在 OptaPlanner 中更改周末定义