【发布时间】:2015-09-15 07:41:43
【问题描述】:
我在 scala 中使用 spark。
我有一个包含 3 列的数据框:ID、时间、RawHexdata。 我有一个用户定义的函数,它接受 RawHexData 并将其扩展为 X 更多列。重要的是要说明每一行 X 是相同的(列不变)。但是,在收到第一个数据之前,我不知道这些列是什么。但是一旦有了头,我就可以推断出来了。
我想要第二个带有上述列的数据框:Id,Time,RawHexData,NewCol1,...,NewCol3。
我能想到的“最简单”的方法是: 1. 将每一行反序列化成json(这里每条数据tyoe都是可序列化的) 2.添加我的新栏目, 3. 从修改后的 json 中反序列化一个新的数据帧,
但是,这似乎是一种浪费,因为它涉及 2 个昂贵且冗余的 json 序列化步骤。我正在寻找更干净的模式。
使用 case-classes 似乎是个坏主意,因为我不知道列数或列名。
【问题讨论】:
-
您能否提供更多详细信息?
RawHexdata中可能包含的数据示例。 -
在满足某些条件后,您始终可以应用
.withColumn()函数 -
Rawhexdata 是由一堆嵌入式设备发送的巨大二进制 blob。 I 包含将被反序列化为其他平面数字数据的数据:双精度数、整数、复数等。稍后我想让分析师使用 Sparksql 查询这些数据。但是,当数据在 blob 中时,这是不可能的,所以我编写了一个 UDF“parseblob”,它接受一个 blob 并返回一个 map/json 对象(我可以更改返回类型以适应解决方案)。我希望这张地图的内容是另一个表中的列,其中每一行都与原始原始数据相关。
-
@niemand,withcolumn 一次允许一个 cloumn。无论如何我可以使用 withcolumn 而不为我添加的每一列重新解析整个 blob? (例如,我想添加 3 列)。如果是这样,我可以通过重复调用 withcolumn 轻松添加一个添加多个列的函数,但是,我能想到的每个 withcolumn 合成器都需要每行多次解析原始数据。我对 Scala 不是很熟悉,也许有什么办法……
标签: sql json scala apache-spark apache-spark-sql