Spark String列到具有case类的元素数组

时间:2018-06-04 10:09:08

标签: scala apache-spark apache-spark-sql

我在spark dataframe列中有一个以下字符串。

X1|[MODULE1|SYNC|DATE:TIME]|A1|B1|C1|D1|O1|P1|Q1|R1|S1|X2|[MODULE1|SYNC|DATE:TIME]|A2|B2|C2|D2|O2|P2|Q2|R2|S2|X3|[MODULE3|SYNC|DATE:TIME]|A3|B3|C3|D3|O3|P3|Q3|R3|S3

这实际上是三个独立设备X1,X2,X3的设备数据(设备数量可能会有所不同)

X1|[MODULE1|SYNC|DATE:TIME]|A1|B1|C1|D1|O1|P1|Q1|R1|S1|
X2|[MODULE1|SYNC|DATE:TIME]|A2|B2|C2|D2|O2|P2|Q2|R2|S2|
X3|[MODULE3|SYNC|DATE:TIME]|A3|B3|C3|D3|O3|P3|Q3|R3|S3|

这里的设备用case类Device表示:

case class Device(deviceId:String, status:String, a:String, b:String, c:String, ........,s: String)

具有类似于以下的映射。

X1 - deviceId
[MODULE1|SYNC|DATE:TIME] - status
A1 - a
.....

在这种情况下,我编写了一个函数split_device_column来将字符串拆分为大小为33的Seq [String](大小总是乘以11,取决于设备的数量)。

def split_device_column (s: String): Seq[String] = {...}

 X1
 [MODULE1|SYNC|DATE:TIME]
 A1
 B1
 C1
 D1
 O1
 P1
 Q1
 R1
 S1
 X2
 [MODULE1|SYNC|DATE:TIME]
 A2
 B2
 C2
 D2
 O2
 P2
 Q2
 R2
 S2
 X3
 [MODULE3|SYNC|DATE:TIME]
 ...
 ...
 S3

我无法找到将此序列转换为case类元素数组的方法。我明白这最有必要进入udf。

关于此的任何输入?

0 个答案:

没有答案