使用二进制(proto-buffer)列读取Parquet文件。

3
我有一个parquet文件,每一列都是不同的序列化proto-buffer。当我尝试读取时,出现了“

”错误。

Dataset<Row> df = spark.read().parquet("test.parquet"); 
df.printSchema();

我收到了

root
   |-- A: binary (nullable = true)
   |-- B: binary (nullable = true)

但是我想看到

root
   |-- A: struct
        |-- a: string
        |-- b: int
   |-- B: struct
        |-- c: int
        |-- d: string

有没有一种方法可以读取parquet文件,并将每个二进制列反序列化为结构体? 我曾考虑使用Apache Parquet Proto,但这对我来说并不适用,因为它假设parquet文件的列已经是结构体格式,而不是二进制格式。

1个回答

1

可能有更简单的方法,但这是我想到的:

也许你可以为你的ProtoBuff模型定义scala case类,如果你的模型更复杂,你可以使用类似scalaPB的工具将proto文件转换为scala case类。

case class A(a:String,b:Int)
case class B(c:String,d:Int)

编写一个UDF,将二进制转换为适当的模型。
val toA = udf { (values: Array[Byte]) =>
  val aRow = ModelA.parseFrom(values);
  A(aRow.a,aRow.b)
}

然后您可以使用上述 UDF 解析二进制列

df.select(toA($"A")).show()

我还没有测试这段代码,但它应该可以工作。如果你遇到任何问题,请告诉我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接