当前位置: 首页 > 知识库问答 >
问题:

使用spark avro跳过记录中的字段

庄弘业
2023-03-14

更新:spark avro软件包已更新以支持此场景。https://github.com/databricks/spark-avro/releases/tag/v3.1.0

我有一个AVRO文件,它是由我无法控制的第三方创建的,我需要使用spark进行处理。AVRO模式是一个记录,其中一个字段是混合联合类型:

{    
    "name" : "Properties",                              
    "type" : {                                          
    "type" : "map",                                   
    "values" : [ "long", "double", "string", "bytes" ]
}                                                   

这是不支持的火花avro阅读器:

除了上面列出的类型之外,它还支持读取三种类型的联合类型:联合(int, long)联合(浮动,双)联合(something, null),其中某些是上面列出的受支持的Avro类型之一或受支持的联合类型之一。

在阅读AVRO的模式演变和解决方案时,我希望通过指定一个省略该字段的不同读取器模式,能够在跳过问题字段的同时读取该文件。根据AVRO Schema Resolution docs,它应该可以工作:

如果writer的记录包含一个字段,而该字段的名称不在reader的记录中,那么writer对该字段的值将被忽略。

所以我用

 val df = sqlContext.read.option("avroSchema", avroSchema).avro(path)

其中,avroSchema是作者使用的完全相同的模式,但没有问题字段。

但对于混合并集类型,我仍然会遇到同样的错误。

AVRO支持这种模式演变场景吗?用avro-park?有其他方法可以实现我的目标吗?

更新:我已经用ApacheAvro1.8.1测试了相同的场景(实际上是同一个文件),它可以正常工作。然后它必须与spark avro一起使用。有什么想法吗?

共有1个答案

龚伯寅
2023-03-14

更新:spark avro软件包已更新以支持此场景。https://github.com/databricks/spark-avro/releases/tag/v3.1.0

这实际上并没有回答我的问题,而是为同一个问题提供了不同的解决方案。

由于目前spack-avro is没有这个功能(请参阅我对问题的评论)-我转而使用了avro的org.apache.avro.mapreduce和park的newAPIHadoopFile。这是一个简单的例子:

val path = "..."
val conf = new SparkConf().setAppName("avro test")
  .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") 
val sc = new SparkContext(conf)

val avroRdd = sc.newAPIHadoopFile(path,
  classOf[AvroKeyInputFormat[GenericRecord]],
  classOf[AvroKey[GenericRecord]],
  classOf[NullWritable])

与spark avro相反,官方的avro libs支持混合联合类型和模式演化。

 类似资料:
  • 问题内容: 如何在数据库中选择一些记录,从而跳过MS Access中的行数。在MySQL中是。火鸟是等。 在Google上根本没有运气=( 问题答案: 如果您知道要跳过多少条记录,则可以执行以下操作: 然后,您可以排除不需要的记录。 如果您随后知道要返回的记录总数,则可以执行以下操作:

  • 我想用IntelliJ IDEA2018.3.4将控制台输出记录到一个文件中。 我找到了这个答案,但是,我需要的是日志文件来记录多次运行,相反,最后一次运行会覆盖日志文件。 根据官方文档,我应该通过勾选“run/Debug Configurations”中的“Skip Content”复选框来获得连续日志记录,但我仍然只能获得日志中的最后一次运行。 我这样做对吗?还是有别的办法?

  • 我正在使用在AWS Lambda中创建的函数来触发和处理插入到DynamoDB表中的每条记录。 但我最近注意到很多记录丢失并且没有被处理。例如,每插入50,000条记录,可能会处理大约2000-3000条记录。:( 我还注意到,在一段时间内,这个正在处理的数字每5分钟左右缓慢增加大约100-200条记录。我使用aws命令行检查了这一点: aws Dynamodb扫描--table-name myD

  • 问题内容: 我想做一个查询,从中选择一堆数据,但是我希望能够通过仅选择每三个记录,甚至每个百分之一的记录来降低数据的分辨率。任何。 有什么简单的方法可以用ActiveRecord做到这一点吗? 问题答案: 在Oracle中,我将其编写如下: 这样做的好处是,过滤器发生在数据库中,因此不会检索所有内容。 在PostgreSQL中,这称为(实际上是SQL标准)。在MySQL中,不支持此功能。 在mys

  • 问题内容: 我的本地计算机上有一个数据库,我想将数据导入主机上的数据库。这两个数据库的是相同的,相同的,等等。 当我从本地数据库通过该表并通过我的主机上的phpmyadmin 通过该表时,会弹出一个错误消息,告诉我存在重复的条目并停止了整个操作。 如何通过phpmyadmin导入数据,跳过重复的条目,并在流程结束时显示重复的列表? 我可以做的一个解决方案是在主机上调用数据库中主键的所有值,并在导入

  • 问题内容: 我有一个表格,其中有一个父/子关系,其中每个孩子的列数据都需要连接到父母中。 这是一些示例数据,该数据已损坏,因此父记录(Id = 96) 为 NULL 。关系是通过字段进行的: 数据应如下所示: 编辑: 后代级别可以是任何深层次,但深子级后代需要更新为主要的父级 。拿下面的最后两个记录( Id = 100 和 Id = 101 )都链接到97。因为 Id = 97 IS NOT NU