Scala 如何从二进制protobuf中提取JSON?

Scala 如何从二进制protobuf中提取JSON?,scala,apache-spark,protocol-buffers,spark-structured-streaming,Scala,Apache Spark,Protocol Buffers,Spark Structured Streaming,将Apache Spark 2.2.0结构化流视为: jsonStream.printSchema() root |-- body: binary (nullable = true) 正文中的数据类型为Protocol Buffers v2和嵌套JSON。看起来像 syntax = "proto2"; message Data { required string data = 1; } message List { repeated Data entry = 1; } 如何提取

将Apache Spark 2.2.0结构化流视为:

jsonStream.printSchema()
root
 |-- body: binary (nullable = true)
正文中的数据类型为Protocol Buffers v2和嵌套JSON。看起来像

syntax = "proto2";

message Data {
  required string data = 1;
}

message List {
  repeated Data entry = 1;
}
如何提取Spark中的数据以“进一步”处理它

我查看了一下,但当我在Jupyter中运行代码时,无法将“.proto”代码内联。我也不知道如何将数据帧转换为流上的RDD。由于流媒体源,尝试
.rdd
失败


更新1:我找到了如何使用ScalaPB的控制台工具从protobuf规范生成Scala文件。由于“类型不匹配”,我仍然无法导入它们;dr编写一个用户定义函数(UDF),将二进制字段(protobuf的JSON)反序列化为JSON

将序列化的
正文
(以
二进制
格式)视为一个表列。暂时忘掉结构化流(和流数据集)

然后让我将问题的措辞改为:

如何将二进制值转换为[这里是您的格式]

有些格式可以直接
转换
,这使得将二进制文件转换为字符串变得非常简单,如下所示:

$"body" cast "string"
如果字符串是JSON或unixtime,则可以使用内置的“转换器”,例如来自_JSON的
或来自_unixtime的

介绍应该给您一个如何进行类似您的转换的提示

正文中的数据类型为Protocol Buffers v2和嵌套JSON

要处理此类字段(protobuf+json),您必须编写一个Scala函数,将“有效负载”解码为json,并使用以下命令创建一个用户定义函数(UDF):

udf(f:UDF1[\uu,u],returnType:DataType):UserDefinedFunction将Java UDF1实例定义为用户定义函数(udf)。调用方必须指定输出数据类型,并且没有自动输入类型强制。默认情况下,返回的UDF是确定性的。要将其更改为非确定性,请调用API
UserDefinedFunction.asNondeterministic()

然后使用诸如
from_json
get_json_object
之类的函数

为了简化您的案例,请编写一个单参数函数进行转换,并使用
UDF
函数将其包装成一个UDF


正在尝试。由于流源,rdd失败

使用或

foreach(f:(T)⇒ 单位):单位将函数f应用于所有行

foreachPartition(f:(迭代器[T])⇒ Unit):Unit将函数f应用于此数据集的每个分区


谢谢,听起来很合理,你有什么例子可以给我指吗?考虑到Protobuf需要“mapper”类,我仍然必须导入生成的代码,我是对的,还是遗漏了什么?我从来没有使用过Protobuf,所以我在这里无能为力。然而,这超出了Spark的能力范围,“如果你能在Scala中做到这一点,那么你应该在Spark中使用udf”。你能描述一下如何从protobuf规范生成Scala文件吗?您能描述一下您是如何尝试为Spark导入它们的吗?