我正在构建一个数据湖,但遇到了一件非常琐碎的事情。我将使用Hadoop/HDFS作为我们的数据湖基础设施,并以parquet格式存储记录。数据将来自Kafka队列,该队列每次都会发送一条json记录。json记录中的键可能会因消息而异。例如,在第一条消息中,键可以是“a”,'B',而在第二条消息中,键可以是'c','d'。我使用pyarrow以parquet格式存储文件,但根据我的理解,我们必须预定义模式。因此,当我尝试编写第二条消息时,它会抛出一个错误,指出键'c' 'd'没有在schema上定义。有人能指导一下如何处理这个问题吗?除了pyarrow之外,任何其他库也可以工作,但具有这个功能。
1条答案
按热度按时间yjghlzjz1#
Parquet支持Map类型的示例,其中的字段事先是未知的。或者,如果某些字段是已知的,为这些字段定义更具体的类型,可能使它们可以为空,但是您不能在记录结构的同一层上混合命名字段和Map。
我没有使用过Pyarrow,但我建议使用Spark Structured Streaming并在那里定义一个模式。特别是当从Kafka使用时。Spark默认的HDFS输出写入器使用Parquet。