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

如何从二进制原型中提取JSON?

唐泳
2023-03-14

将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中的数据以“进一步”处理它?

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

更新1:我发现了如何使用ScalaPB的控制台工具从protobuf规范生成Scala文件。由于“类型不匹配”,我仍然无法导入它们。


共有1个答案

幸弘光
2023-03-14
匿名用户

tl; dr编写一个用户定义函数(UDF)将二进制字段(带有JSON的协议)反序列化为JSON。

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

那么,让我把这个问题重新表述如下:

如何转换(又名铸)二进制值[这里你的格式]?

有些格式是直接cast-able的,这使得将二进制文件转换为字符串非常容易,如下所示:

$"body" cast "string"

如果字符串是JSON或unixtime,您可以使用内置的“转换器”,即from_jsonfrom_unixtime等函数。

介绍应该给你一个提示,如何进行像你这样的转换。

body中的数据类型为Protocol Buffers v2和嵌套的JSON。

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

UDF(f: UDF1[_,_], returType: DataType):用户定义函数将JavaUDF1实例定义为用户定义函数(UDF)。调用者必须指定输出数据类型,并且没有自动输入类型强制。默认情况下,返回的UDF是确定性的。要将其更改为非确定性,请调用APIUserDefedFunction.as非确定性()

然后使用像from_jsonget_json_object这样的函数。

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

由于流媒体源,尝试. rdd失败。

使用Dataset.foreach或foreach分区。

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

foreach分区(f:(Iterator[T])¶Unit): Unit将函数f应用于此数据集的每个分区。

 类似资料:
  • 我正在分析几个堆转储,并对从堆转储获取jvm参数的方法感兴趣。使用eclipse memory analyzer我可以很容易地获得系统属性和类路径,但我想知道是否有方法获得其他参数,如-xms-xmx等。

  • 我有一个字符串。我想从中提取。为此,我正在努力 但是在输出上我得到了。 我怎样才能走出地狱世界。 谢谢

  • 我需要编写一个能够处理CUrl发送的二进制数据的应用程序,例如: 我创建了一个POST处理方法,如下所示: 然而,它似乎没有返回原始的二进制数据。我试着发送一个GZip文件,在经历了Spring之后,它现在是可解压缩的,这让我相信我要么得到了太多的数据,要么得到了太少的数据。 如何解决此问题并获取原始二进制数据?

  • 我有非常大的二进制文件,其中包含y传感器的x个int16数据点,以及包含一些基本信息的头文件。二进制文件被写为每个采样时间的y值,最多x个采样,然后是另一组读数,依此类推。如果我想要所有的数据,我使用的是numpy。fromfile(),它工作得又快又好。然而,如果我只需要传感器数据的子集或特定传感器,我目前有一个可怕的double for循环,使用的是这要花很长时间。在python中有没有其他更

  • 问题内容: 我对Go完全陌生,我试图读取一个二进制文件,一次读取一个字节或几个字节。该文档并没有多大帮助,我找不到任何教程或简单示例(顺便说一句,Google如何给他们的语言提供这样一个难以理解的名称?)。基本上,如何打开文件,然后将一些字节读入缓冲区?有什么建议吗? 问题答案: 要处理文件,该软件包是您的朋友: 在过去的文件是如何打开更多的控制,看到代替(DOC) 。 为了读取文件,有很多方法。

  • 问题内容: 我正在尝试从URLConnection读取二进制文件。当我使用文本文件对其进行测试时,它似乎可以正常工作,但对于二进制文件则不能。发送文件时,我在服务器上使用以下mime类型: 但是到目前为止,似乎没有任何效果。这是我用来接收文件的代码: 问题答案: 我就是这样